您的位置:首页 > 其它

落单的数 II-LintCode

2017-07-03 13:26 288 查看
给出3*n + 1 个的数字,除其中一个数字之外其他每个数字均出现三次,找到这个数字。

样例:

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

挑战 :

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

思想:

利用位运算,若一个数字出现3次,则该数字的二进制表示中每个位置数值为1出现的次数均为3次。用one表示出现一次,two表示出现两次,three表示出现三次。出现两次即为one中出现一次,之后A[i]中又出现;出现一次,则不能在A[i]再出现,要用异或;three为one中出现一次,two中出现两次;之后将one和two中出现三次的位置均清空(置零)。

#ifndef C83_H
#define C83_H
#include<iostream>
#include<vector>
using namespace std;
class Solution {
public:
int singleNumberII(vector<int> &A) {
int one = 0;
int two = 0;
int three = 0;
for (int i = 0; i < A.size(); ++i)
{
two |= one&A[i];
one ^= A[i];
three = one&two;
one = one&~three;
two = two&~three;
}
return one;
}
};
#endif
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: