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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c_cpp 一个数组,只有一个数出现了一次,其他数出现三次,求出现一次的数。时间复杂度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;
}

以上是关于c_cpp 一个数组,只有一个数出现了一次,其他数出现三次,求出现一次的数。时间复杂度O(N),空间复杂度O(1)的主要内容,如果未能解决你的问题,请参考以下文章

数组中数字出现的次数

数组中数字出现的次数

数组中数字出现的次数

C语言:一个数组中只有两个数字是出现一次

数组中只出现一次的数(其他数出现k次)

数组中只出现一次的数