lintcode 落单的数 II

来源:互联网 发布:ubuntu经常异常假死 编辑:程序博客网 时间:2024/04/28 23:50

落单的数 II 

给出3*n + 1 个的数字,除其中一个数字之外其他每个数字均出现三次,找到这个数字。

样例

给出 [1,1,2,3,3,3,2,2,4,1] ,返回 4

挑战 

一次遍历,常数级的额外空间复杂度

标签 
贪心
相关题目 
思路:和上一道题一样,还是用位操作,尝试消掉出现3次的数字。
对int的32bit的各个位中1出现的次数进行统计,再对数组中所有元素的逐个进行统计,然后对每个bit对3取余,最终的结果就是只出现一次的数字值,再相加就是只出现过一次的数
class Solution {public:    /*     * @param A: An integer array     * @return: An integer     */    int singleNumberII(vector<int> &A) {        // write your code here        int end=0;        for(int i=0;i<32;i++)        {            int num=0;//每位1出现次数            for(auto n:A)            {                if(findzero(n,i))                num++;            }            end+=((num%3)<<i);//再左移恢复原值        }        return end;    }    bool findzero(int i,int k)    {        if((i>>k)&1)//先右移判断        return true;        else        return false;    }};