和上一题一样,往异或方向上想没思路,看了剑指offer的书,觉得这些都是神仙怎么想到这种办法的
这题和异就没关系了,int一共是32位,新建一个各位和的数组,我们把每个数字对应的1和0加到这个数组的对应位置上,比如1,1,1相加就变成了003,再加上2,2,2就是033,再加上4,4,4就是333,再加上1,就是334,加完后,如果某一位上是3的倍数,说明目标数字这一位上是0,如果不是3的倍数,那么这一位上就是1
时间是0(n),第二层的循环因为是常数32,所以是O(1),空间的话开了常数长度的数组也是0(1)
class Solution {
public int findNumberAppearingOnce(int[] nums) {
int[] sums=new int[32];
for(int num:nums){
//该数字的各位和
for(int i=0;i<32;i++){
int tail=(num>>i)&1;
sums[i]+=tail;
}
}
//System.out.println(Arrays.toString(sums));
int res=0;
for(int i=0;i<32;i++){
//sums[i]%3如果不等于0,那么需要为1
res+=(sums[i]%3==0)?0:1<<i;
}
return res;
}
}