剑指 Offer 56 - I. 数组中数字出现的次数
思路
异或
这次有2个出现一次的数,因此异或的结果是两个数的异或。必须想办法分开。
这两个数肯定是不一样的,那么我们取异或结果的最右边的1(x&(-x)),可以通过这一位来区分。
然后把这两组元素分别异或,得到2个数就是所求数
代码
public int[] singleNumbers(int[] nums) {
int []res=new int[2];
int xor=0;
for(int num:nums){
xor^=num;
}
xor&=-xor;
for(int num:nums){
if((xor&num)==0){
res[0]^=num;
}
else{
res[1]^=num;
}
}
return res;
}
剑指 Offer 56 - II. 数组中数字出现的次数 II
思路
其他数字出现3次,那么可以计算每个数各位上1的个数,必然是3*n+1,因此计算后取余即可
代码
public int singleNumber(int[] nums) {
int[] cnt=new int[32];
for(int num:nums){
for(int i=0;i<32;i++){
cnt[i]+=num&1;
num>>>=1;
}
}
int res=0;
for(int i=31;i>=0;i--){
res<<=1;
res+=cnt[i]%3;
}
return res;
}