从位运算出发,计算所有数字每一位出现了多少次一,如果没有那个只出现一次的数字,那么每一位出现的一的次数都应该是三的倍数,所以只需要统计哪些位的一的数量不能被整除,就是相对应的只出现一次的那个数
class Solution {
public int singleNumber(int[] nums) {
int[] n = new int[32];
for(int i = 0; i < nums.length; i++){
for(int j = 0; j < 32; j++){
int t = nums[i] & (1 << j);
if(t > 0)
n[j]++;
}
}
int ans = 0;
for(int i = 0; i < 32; i ++){
if(n[i] % 3 != 0){
ans |= (1 << i);
}
}
return ans;
}
}