俊介三

一天更新一点,一天积累一点

导航

找出数组中两个只出现一次的数字

Posted on 2013-04-01 15:05  俊介三在前进  阅读(204)  评论(0编辑  收藏  举报

题目:一个整型数组里除了两个数字之外,其他的数字都出现了两次。
请写程序找出这两个只出现一次的数字。要求时间复杂度是 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;
}