剑指 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;
}
这篇博客介绍了如何使用位运算和异或操作解决两道编程题:一是找出数组中出现一次的两个数字,二是找出数组中出现三次的数字。通过异或操作找出两个出现一次的数字,利用位运算找到区分它们的关键位。对于出现三次的数字,通过计算每个数的二进制位上1的个数并取余,最终得出结果。
1194

被折叠的 条评论
为什么被折叠?



