Single Number
Given an array of integers, every element appears twice except for one. Find that single one.
Note:
Your algorithm should have a linear runtime complexity. Could you implement it without using extra memory?
特点:一个数字出现一次,其他的出现两次。那么异或运算的性质:任何一个数异或它自己都等于0。而本题出现一次的数恰好只有一个。那么,将数组依次从前向后进行异或,出现两次的数都抵消掉。最后剩余的数就恰好是那只出现一次的一个。
class Solution {
public:
int singleNumber(int A[], int n) {
int i,ret=0;
for(i=0;i<n;++i){
ret=ret^A[i];
}
return ret;
}
};
Single Number II
Given an array of integers, every element appears three times except for one. Find that single one.
Note:
Your algorithm should have a linear runtime complexity. Could you implement it without using extra memory?
数出现两次,我们可以用“异或”来抵消掉,出现三次异或就不行了。
但是我们还是可以利用“抵消”这个原理,逐位考虑,我们记录所有数在该位上出现1的次数,超过三次清0,如果遍历后该位还是为1,那说明要找的那个数该位就是1,否则该位就是0。
参考:
http://blog.csdn.net/a83610312/article/details/12349715
/*
思想:逐位考虑,如果某位上1出现的次数为 3*k +1 的话,那么只出现一次
的数在该位必定为1。
注意:MASK要用unsigned,而不是int
*/
class Solution{
public:
int singleNumber(int A[],int n)
{
unsigned int ret=0;
for(int i=0;i<32;i++)
{
const unsigned int MASK=(1<<i);
int t=0;
for(int j=0;j<n;j++)
t+=(A[j]&MASK)>0?1:0;
ret|=(t%3==0)?0:MASK;
}
return ret;
}
};