解题报告
位1的个数
题目链接:191. 位1的个数
解题思路
n & (n - 1)
操作结果可以把 n 的二进制位的最低位的 1 变为 0,不断操作直到把 n 变为 0,每操作一次计数器 + 1。
解题代码
class Solution {
public:
int hammingWeight(uint32_t n) {
int ans = 0;
while(n){
n &= (n - 1);
ans ++ ;
}
return ans;
}
};
汉明距离
题目链接:461. 汉明距离
解题思路
x ^ y,x和y相同位置上的数字相同则异或结果为 0,相同位置上的数字不同则异或结果为 1,将两个数异或后求 “1” 的个数即可。
解题代码
class Solution {
public:
int hanmmingWeight(uint32_t n){
int ans = 0;
while(n){
n &= n - 1;
ans ++ ;
}
return ans;
}
int hammingDistance(int x, int y) {
return hanmmingWeight(x ^ y);
}
};
只出现一次的数字
题目链接:136. 只出现一次的数字
解题思路
将所有数字都异或操作,偶数个数的数字异或后等于零,只有唯一的奇数个数的数字会留下来。
解题代码
class Solution {
public:
int singleNumber(vector<int>& nums) {
int ans = 0;
for(int i = 0; i < nums.size(); i ++ ){
ans ^= nums[i];
}
return ans;
}
};
只出现一次的数字 II
题目链接:137. 只出现一次的数字 II
解题思路
出现三次的数字,它们二进制对应的第 i 位有三个 0 或 三个 1 ,求和模 3 等于 0 或 3,而只出现一次的数字对应二进制位模 3 则等于 0 或 1。按照这个特点,将所有数字的二进制对应的每一位相加模 3,若结果为 1,即为只出现一次的数字的二进制第 i 位。
解题代码
class Solution {
public:
int singleNumber(vector<int>& nums) {
int ans = 0;
for(int i = 0; i < 32; i ++ ){
int total = 0;
for(auto x : nums){
total += ((x >> i) & 1);
}
if(total % 3){
ans += (1 << i);
}
}
return ans;
}
};