欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

数组中只出现过一次的数,其余均出现三次

程序员文章站 2024-03-16 17:58:22
...

链接:
https://www.nowcoder.com/questionTerminal/1097ca585245418ea2efd0e8b4d9eb7a
来源:牛客网

Single Number的本质,就是用一个数记录每个bit出现的次数,如果一个bit出现两次就归0,这种运算采用二进制底下的位操作^是很自然的。Single Number II中,如果能定义三进制底下的某种位操作,也可以达到相同的效果,Single Number II中想要记录每个bit出现的次数,一个数搞不定就加两个数,用ones来记录只出现过一次的bits,用twos来记录只出现过两次的bits,ones&twos实际上就记录了出现过三次的bits,这时候我们来模拟进行出现3次就抵消为0的操作,抹去ones和twos中都为1的bits。

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];//要在更新ones前面更新twos
            one ^= A[i];
            three = one & two;//ones和twos中都为1即出现了3次
            one &= ~three;//抹去出现了3次的bits
            two &= ~three;
        }
        return one;
    }

1. 参考
牛客网single-number