找出单身狗1,2

简介: 找出单身狗1,2

1. 单身狗1

题目如下:

思路:一部分人可能会使用对数组排序,遍历数组的方式去找出只出现一次的数字,但这种方法的时间复杂度过高,有时候可能会不满足要求。
有一种十分简便的方法是使用异或运算:

代码实现如下:

#include <stdio.h>
int main()
{
  int arr[] = { 1,2,3,4,5,1,2,3,4 };
  int num = 0;
  int sz = sizeof(arr) / sizeof(arr[0]);
  for (int i = 0; i < sz; i++)
  {
    num ^= arr[i];
  }
  printf("%d\n", num);
  return 0;
}

2. 单身狗2

题目如下:

思路:通过上面的题目,我们不难想到,如果我们可以把数组中的数据分离开,再分别进行异或,就可以找出那两个数字。

代码实现如下:

#include <stdio.h>
int main()
{
  int arr[] = { 1,2,3,4,5,1,2,3,4,6 };
  int sz = sizeof(arr) / sizeof(arr[0]);
  int num = 0;
  //1.整体异或,结果就是两个不同数字的异或结果  5^6
  for (int i = 0; i < sz; i++)
  {
    num ^= arr[i];
  }
  //2.找到5^6倒数第k位为1
  int k = 0;
  for (int i = 0; i < 32; i++)
  {
    if (((num>> k) & 1) == 1)
    {
      k = i;
      break;
    }
  }
  //3.根据倒数第k位为1或0,把全部数字分开,再分别异或
  int p1 = 0;
  int p2 = 0;
  for (int i = 0; i < sz; i++)
  {
    if (((arr[i] >> k) & 1) == 1)
    {
      p1 ^= arr[i];
    }
    else
    {
      p2 ^= arr[i];
    }
  }
  printf("%d %d", p1, p2);
  return 0;
}
目录
相关文章
|
2月前
|
算法
leetcode:136. 只出现一次的数字(找单身狗)
leetcode:136. 只出现一次的数字(找单身狗)
21 0
|
6天前
|
人工智能 测试技术 Windows
技术心得:威威猫系列之吃鸡腿
技术心得:威威猫系列之吃鸡腿
每日一练Day04:寻找单身狗
每日一练Day04:寻找单身狗
|
2月前
|
算法 机器人
瑜伽球上遛“狗”!
【5月更文挑战第14天】
21 3
|
2月前
单身狗问题
单身狗问题
19 0
|
9月前
单身狗1和单身狗2(C语言版)
单身狗1和单身狗2(C语言版)
|
12月前
寻找单身狗
寻找单身狗
51 0
|
12月前
|
算法
【LeetCode】260.只出现一次的数字 III(找出单身狗)
【LeetCode】260.只出现一次的数字 III(找出单身狗)
62 0
|
算法 C++
你是真的“C”——找单身狗~
初阶——找单身狗问题: 在一组数组中,有一只“单身狗”(该数字只出现一次),其他的数字都有一个和自己相同的数字。 其实解答此题有许多的方法,例如直接将数组进行一个排序,然后定义两个指针,然后寻找到单身狗。这里介绍的是用异或运算来解答这道题目,效率也比较高。
76 0