思想:模拟3进制不进位加法运算,所有数相同位相加对3取余,得到的结果要么为1,要么为0,最终结果即为那个出现一次的数。
代码:
public int getSingle(int[] arr, int k){
int res = 0;
int sum = 0;
for (int i = 0; i < 32; i++) {
sum = 0;
for (int j = 0; j < arr.length; j++) {
sum += (arr[j]>>i)&1;
}
if(sum % 3 == 1){
res = res | (1<<i);
}
}
return res;
}
算法时间复杂度O(3N),空间复杂度O(1)
该思想可以推广到一个数组中,只有一个数只出现了一次,其他数全是出现了K次,找出这个数。模拟K进制不进位加法。