解题思路:用一个长度为32的数组a代表32个bit。用它记录下数组A中每一个元素在每一个bit上出现的次数(0次或1次)。然后对每个bit(即数组a的每个元素) 除3取余(出现三次的数,在每个bit上出现的次数叠加后,要么是3要么是0),每个bit余下来的值便是出现一次的数的每个bit上的值。最后根据每个bit的值,转成十进制的,便是出现一次的数。
public class Solution {
public int singleNumber(int[] A) {
int i, j, result = 0;//result必须initialized
int[] a = new int[32];
for(i = 0; i < A.length; i++)//这一步是看看每一位上有几个1
{
j = 0;
while (j < 32 && A[i] != 0)
{
a[j] = (A[i] & 1) +a[j];
//注意运算优先级!!!!a[j] = A[i] & 1 +a[j]错误,这个式子是现加后与的
//位运算符的先后顺序,比加减低,甚至低于关系运算符
A[i] = A[i] >> 1;
j++;
}
}
for(i = 0; i < 32; i++)
{
a[i] = a[i] % 3;//第i位上的最终结果
j = 0;
while(j < i && a[i] >= 1)
//j < i && a[i] == 1错误,a[i]只会在第一次运算时为1,考虑限定范围时太随意。
{
a[i] = a[i] * 2;
j++;
}
result = a[i] + result;
}
return result;//2
}
}