您的位置:首页 > 其它

lintcode 落单的数 II

2017-09-16 12:26 246 查看


落单的数 II 

 描述
 笔记

 数据

 评测

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

您在真实的面试中是否遇到过这个题? 

Yes

样例

给出 [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;
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  位操作