一个数组中只有两个数字是出现一次,其他所有数字都出现了两次。 找出这两个数字
2016-07-31 22:40
766 查看
从头到尾依次异或数组中的每一个数字,那么最终得到的结果就是两个只出现一次的数字的异或结果。因为其他数字都出现了两次,在异或中全部抵消掉了。由于这两个数字肯定不一样,那么这个异或结果肯定不为0,也就是说在这个结果数字的二进制表示中至少就有一位为1。我们在结果数字中找到第一个为1的位的位置,记为第N位。现在我们以第N位是不是1为标准把原数组中的数字分成两个子数组,第一个子数组中每个数字的第N位都为1,而第二个子数组的每个数字的第N位都为0。
#include <stdio.h> #include <stdlib.h> void find(int a[], int sz) { int i = 0; int num1 = 0; int num2 = 0; int num = 0; int flag = 0; for (i = 0; i < sz; i++) { num = num^a[i]; } for (i = 0; i < 32; i++) { if (((num >> i) & 1) != 1)//找异或之后这个数字二进制数中最先出现的1的位置 { flag++; } else break; } for (i = 0; i < sz; i++) { if (((a[i] >> flag)&1) == 1)//分成2组 num1 ^= a[i]; else num2 ^= a[i]; } printf("%d %d\n",num1,num2); } int main() { int a[] = { 1, 2, 2, 3 }; int sz = sizeof(a) / sizeof(a[0]); find(a, sz); system("pause"); return 0; }
相关文章推荐
- C语言- 一个数组中只有两个数字是出现一次,其他所有数字都出现了两次,找出这两个数字,编程实现。
- 一个数组中只有两个数字是出现一次,其他所有数字都出现了两次。 找出这两个数字,编程实现
- 【C语言】一个数组中只有两个数字是出现一次,其他所有数字都出现了两次,找出这两个数字!
- 一个数组中只有两个数字是出现一次,其他所有数字都出现了两次。 找出这两个数字,编程实现
- 一个数组中只有两个数字是出现一次,其他所有数字都出现了两次,找出这两个数字,编程实现
- 一个数组中只有两个数字是出现一次,其他所有数字都出现了两次。 找出这两个数字,编程实现
- 一个数组中只有两个数字是出现一次,其他所有数字都出现了两次,找出这两个数字,编程实现。
- 一个数组中只有两个数字是出现一次,其他所有数字都出现了两次。 找出这两个数字,编程实现。
- .一个数组中只有两个数字是出现一次,其他所有数字都出现了两次。 找出这两个数字,编程实现。
- 一个数组中只有两个数字是出现一次,其他所有数字都出现了两次。找出这两个数字,编程实现。
- 一个数组中只有两个数字是出现一次,其他所有数字都出现了两次。 找出这两个数字,编程实现。
- 一个数组中只有两个数字是出现一次,其他所有数字都出现了两次。 找出这两个数字,编程实现。
- 1.求第n个斐波那契数(非递归实现)。 2.一个数组中只有两个数字是出现一次,其他所有数字都出现 了两次。 找出这两个数字,编程实现。
- 一个数组中只有两个数字是出现一次,其他所有数字都出现了两次,找出这个数字
- 一个数组中只有两个数字是出现一次,其他所有数字都出现了两次,找出这两个数字
- 一个数组中只有两个数字是出现一次,其他所有数字都出现了两次。找出这两个数字
- 一个数组中只有两个数字是出现一次,其他所有数字都出现了两次。
- 一个数组中只有两个数字是出现一次,其他所有数字都出现了两次。
- 一个数组中只有两个数字是出现一次,其他所有数字都出现了两次。
- 一个数组中只有两个数字是出现一次,其他所有数字都成对出现,找出这两个数字,编程实现