题目
代码
class Solution {
public int singleNumber(int[] nums) {
//可以从每个二进制位开始判断,只有0和1两个选项
//采取只分析1的方式,如果当前这一位的1的次数和是3的倍数,说明答案不在里面
//如果当前这一位1的次数和不是3的倍数,说明答案在里面
//例子:
//4 5 4 5 4 5 3
//100 101 100 101 100 101 011
//第一种情况,当前这一位的1的次数和不是3的倍数,例如取第三位,3的这一位是0,数组的1的次数和是6,很明显6%3==0,而且6/3=2,有两个元素出现了三次,因此答案不在这里面,因此答案这一位是0
//第二种情况,当前这一位的1的次数和是3的倍数,例如取第一位,3的这一位是1,数组的1的次数和是4,很明显4%3!=0,因此答案在这里面,因此答案这一位是1
//感想,想不明白就举例子,干想是很难的,小马过河
//先定义一个数值表示答案
int res = 0;
//遍历32位
for(int i = 0; i < 32; i++){
//定义一个数据,记录出现1的个数
int count = 0;
//遍历数组的每个元素
for(int k = 0; k < nums.length; k++){
//采用数组右移i位然后与1取按位与的方式来判断是不是1
// | 0 是不行的,例如当前是2 2 3 2 2与0异或时,10 | 00 = 10 结果得到2
count += (nums[k] >> i) & 1;
}
//判断答案的第i位
if(count % 3 != 0){
//说明答案当前位是1,采用按位或的方式来组建答案
//按位或的规则是,相同为0,不同为1
//由于res是从0开始的,因此每一位都是0,那么如果用0与0按位或,还是0,如果用1按位或,就是1
res |= (1 << i);
}
}
return res;
}
}