willsun888
10/27/2013 - 1:05 PM

一个数组,只有一个数出现了一次,其他数出现三次,求出现一次的数。时间复杂度O(N),空间复杂度O(1)

一个数组,只有一个数出现了一次,其他数出现三次,求出现一次的数。时间复杂度O(N),空间复杂度O(1)

/*
*一种做法是,采用一个33位的数组来保存每一bit上1的次数,然后每次模3以满3时清零。
*然而这不满足空间复杂度O(1)的要求.
*/

/*
*另一种做法如下:
*其中one记录了所有出现了模3余1次的bit,two记录的是余2的,three存储某个bit出现3次。 
*~three表示当一个bit出现第3次的时候,把它清掉
*最后输出one(中那个特殊的数出现2次的话,应该输出two)
*/
int singleNumber(int A[],int N) {
    int one = 0;
    int two = 0;
    int three = 0;
    for(int i=0;i<N;i++){
        two |= one & A[i];
        one ^= A[i];
        three = one & two;
        one = ~three & one;
        two = ~three & two;
    }
    return one;
}