文章目录
剑指 Offer 15. 二进制中1的个数
- 思路:
- 做与运算,如:(11)&(10) = (10),那么就是将3&2=2,只有两个位都为1的时候,结果才为1.
- 采用与运算就可以不断缩小问题的大小,直到0;
- 代码:
public class Solution {
// you need to treat n as an unsigned value
public int hammingWeight(int n) {
int res = 0;
while(n!=0){
n = n & (n - 1);
res++;
}
return res;
}
}
剑指 Offer 56 - I. 数组中数字出现的次数
- 思路:
详细题解
通过上图很明显的能说明解析步骤,这里只对步骤2进行一个个人理解分析:
第一步进行异或操作完了之后,那么就是1^6,此时如何将两个数分开?
那么可以根据与某个数的&运算结果的不同将第一步得到的数划分成两个结果,那么和谁&?
那么,只需要根据第一次异或运算的结果,找到某一位是不一样的即可,那么,即:使用1 & (第一次异或结果),本例使用的是找1,即找到某一位二进制位是1的地方,然后以此进行划分,对原数组。
- 代码:
class Solution {
public int[] singleNumbers(int[] nums) {
int x = 0, y = 0, n = 0, m = 1;
for(int num : nums){
n ^= num;
}
while((n & m) == 0){
m <<= 1;
}
for(int num : nums){
if((num & m) != 0){
x ^= num;
}
else {
y ^= num;
}
}
return new int[]{x, y};
}
}