Given an array of integers, everyelement 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^a = a。a^a = 0。a^b^a = a^a^b = b^a^a = b。
由上述公式可知,偶数个相同的数相异或为0,任何数和0异或为其本身,所以只需将数组里的数异或一次,最后得到的数就是唯一出现的数。
代码:
int singleNumber(int A[], int n) {
int num=0;
for(int i=0; i!=n; i++)
num ^= A[i];
return num;
}
Leetcode: single-number-ii
Given an array of integers, everyelement 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?
思路:将数组的每个数按位计算每位出现的次数,因为数组里的数除了一个只出现一次,其它的数都出现3次,那么计算每个数的每位出现的次数不是3的倍数就是mod 3为1。mod 3为1的那一位必定是只出现一次的数的那一位。
代码:
int singleNumber(int A[], int n) {
int tmp=1;
int num=0;
for(int i=0; i!=32; i++)
{
int count=0;
for(int j=0; j!=n; j++)
{
if(A[j]&(tmp<<i))
count++;
}
if(count%3)
num |= (tmp<<i);
}
return num;
}