C语言实现一个int类型数组里除了两个数字之外,其他的数字都出现了两次,找出这两个数字
2019-09-07 15:44
1331 查看
题目是这样叙述的:
在一个数组中除两个数字只出现1次外,其它数字都出现了2次, 要求尽快找出这两个数字。
要求:时间复杂度为O(N),空间复杂度为O(1)。
请看我的分析:
将这道题简单化:
一个数组中只有一个数字出现一次,其他数字都是成对出现的,这时我们可以根据异或运算符的特性:A^B^A = B; 0 ^ A = A;我们可以将这个数组的全部元素依次做异或运算,最终结果就是那个只出现一次的数字。
不会的可看本人(2019-04-04)那天的博客
如果这个数组中出现两个不同的数字,而其他数字均出现两次,假设这两个数字分别是x, y。那如果可以将x, y分离到两个数组。这时这道题就变成两个我们简化之后的版本中的数组了。这样问题就可以得到解决了。由于x,y肯定是不相等的,因此在二进制上必定至少有一位是不同的。根据这一位是0还是1可以将x,y分开到A组和B组。并且数组中其他元素也可以根据这个方法划分到两个数组中。这时将两个数组分别做异或运算,结果就是这两个数字。
#include<stdio.h> #define SIZE(arr) sizeof(arr)/sizeof(arr[0]) void find_num(int *arr, int len,int *num1,int *num2) { int i; int sum = 0; for (i = 0; i < len; i++) { sum^=*(arr + i);//异或出所有数字 } int j; for (j = 0; j < sizeof(int)* 8; j++)//int类型数组的字节数32 { //if(sum>>j&1==1)也正确,不知道优先级,尽量加上,下面一样 if (((sum >> j) & 1) == 1)//说明sum在右移 j 个单位后,二进制不一样 { break; } } for (i = 0; i < len; i++) { if (((*(arr + i) >> j) & 1) == 1) { *num1 ^= (*(arr + i));//异或 j 位置为1的一组数字 } else { *num2 ^= (*(arr + i));//异或 j 位置为0的一组数字 } } } int main() { int arr[] = { 1, 3, 5, 7, 1, 3, 5, 9 }; int num1=0, num2=0; find_num(arr,SIZE(arr),&num1,&num2); printf("%d %d", num1, num2); return 0; }
总结:复杂问题简单化,把两个出现一次的数字分割为两组出现一次的数组
相关文章推荐
- 一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字
- 一个整型数组里除了两个数字之外,其他的数字都出现了两次,请写程序找出这两个只出现一次的数字
- 一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字
- 一个整型数组里除了两个数字之外,其他的数字都出现了两次,请写程序找出这两个出现一次的数字
- 一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字
- 经典程序面试题 题目:一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。要求时间复杂度是O(n),空间复杂度是O(1)。 分析:这是一道很新颖的关于位运算的
- C语言- 一个数组中只有两个数字是出现一次,其他所有数字都出现了两次,找出这两个数字,编程实现。
- 一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。
- 一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。
- 一个整型数组里除了一个或者两个或者三个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。要求时间复杂度是O(n),空间复杂度是O(1)
- C语言实现:一个数组中只有两个数字只出现一次, 其他所有数字都出现了两次。 找出这两个数字
- 一个整数数组里面,除了两个数之外,其他的数字都出现了两次,写一个程序找出这两个数
- 算法习题61:找出数组中两个只出现一次的数字:一个整型数组里除了两个数字之外,其他的数字都出现了两次
- 一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。
- 一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字
- 一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字
- 一个整型数组里除了一个或者两个或者三个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。要求时间复杂度是O(n),空间复杂度是O(1)
- 一个整型数组里除了一个或者两个或者三个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。要求时间复杂度是O(n),空间复杂度是O(1)
- 一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。
- 一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。