题目:一个整型数组里除了两个数字之外,其他的数字都出现了两次。
请写程序找出这两个只出现一次的数字。要求时间复杂度是 O(n) ,空间复杂度是 O(1) 。
思路:这是个比较新颖的题,经典的题是“给一个数组里面只有一个数字出现一次,其余的数都出现两次,把这个唯一的数找出来”,利用OXR操作的特性很容易把它找出来。即,抑或操作,相同为0,不同为1
(0 ^ x) == x
(x ^ x) == 0本题思路:抑或所有数,得到的是要找的数num1 num2的抑或值。由于这两个数是不相等的,那么这个抑或值一定不为0,就找到为1的位是那个,把原数组根据这个位分成两组。每组抑或得到的值即为所求的两个不同的数。
代码:
#include <stdio.h> void findTowNum(int* arr, int len, int& num1, int& num2){ int total = 0; int i; for(i=0;i<len;i++) total ^=arr[i]; int j=0; //注意一定一定要加括号!位操作优先级比==还低 while((total&1) == 0){ j++; total >>=1; } num1 =0; num2 = 0; for(i=0;i<len;i++){ if(((arr[i]>>j)&1)==0) num1^=arr[i]; else num2^=arr[i]; } } int main(){ int arr[] = {1,4,3,3,2,1,5,4}; int a,b; findTowNum(arr,8,a,b); printf("%d %d\n",a,b); return 0; }