题目连接
看别人的思路的
/* * 初始化结果为0 * 将数组中的每一个元素按照32位二进制进行展开, * 遍历数组中每一个元素的每一位,若该为=1,则计数器+1, * 遍历结束后,若cnt不是3的倍数那么 将 1左移i位并与原来的结果进行按位或操作
位运算技巧
1100 可以看成 1<<3 | 1 << 2,若把100看成res,那么1100就可以看成 res | 1<<3
class Solution {
public int singleNumber(int[] nums) {
int ans = 0;
for(int i=0;i<32;i++){
int sum = 0;
for(int num:nums)
sum=sum+((num>>i)&1);
if(sum%3!=0)//要是等于0呢?由于是算数左移(左移一位,末尾补零),所以零不用管
ans |=(1<<i);
/**
* 以nums = {7,3,7,3,7,3,5}为例
*
* 1 1 1
* 0 1 1
* 1 1 1
* 0 1 1
* 1 1 1
* 0 1 1
* 1 0 1
= 4 6 7 这个是1的个数
1 0 1 进行模三
101 = 1 << 2 | 1 << 0
* */
}
return ans;
}
}
类似的
LC 136,自己搜一下
思路:这个我承认有一点技巧
异或可以将出现两次的变量消除掉,不论变量出现的位置,例如
1 2 1 异或的结果是2
class Solution {
public int singleNumber(int[] nums) {
int res = 0;
for(int i=0;i<nums.length;i++){
res = res ^ nums[i];
}
return res;
}
}