您的位置:首页 > 其它

LeetCode——Single Number II

2015-10-28 00:02 447 查看
这道题有两种思路吧,一种是针对这道题的特定思路:

class Solution {
public:
int singleNumber(int A[], int n) {
int one=0, two=0, three=0;
for(int i=0; i<n; i++){
two |= one&A[i];
one^=A[i];
//cout<<one<<endl;
three=one&two;
one&= ~three;
two&= ~three;
}
return one;
}
};
基本思路是统计各个二进制位上1出现的次数,one变量的位为1代表到当前元素为止,此位上1出现过1次,同理,two变量中的位为1代表此位上的1已经出现两次了,three也是如此。当某位上的1出现三次后,也就是变量three中的此位为1,就把变量one和two清零,重新计算。如此一来,循环结束时,one中1出现过三次的位都被清零了,少于三次的才能保留下来,所以返回one即可。

另一种思路更通用,其余元素都出现k次,只有一个元素例外时,可用这种方法:

class Solution {
public:
int singleNumber(vector<int> &A) {

int bit[32] = {0};

for(int i = 0; i < A.size(); ++i)
{
for(int j = 0; j < 32; ++j)
{
bit[j] += A[i]&1;
A[i] >>= 1;
}
}

int result = 0;

for(int j = 0; j < 32; ++j)
{
if(bit[j]%3 != 0)
{
result += 1 << j;
}
}

return result;
}
};
这种方法统计数组元素中每一位(假设一个整数位32bit)为1的次数,除了一个数外其余数都出现k次,那么出现k次的数其每位为1的次数之和必然是k的倍数,如果bit数组中某一位的值不是k的整数倍,说明出现次数不为k的那个数在那一位上的值为1。如此一来,我们就知道那个数在哪些位上为1 ,自然就知道这个数是多少了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: