文章目录
一、191. 位1的个数
1.原题链接
2.题目描述
编写一个函数,输入是一个无符号整数(以二进制串的形式),返回其二进制表达式中数字位数为 ‘1’ 的个数(也被称为汉明重量)。
3.解题思路
位运算
4.源码
class Solution {
public:
int hammingWeight(uint32_t n) {
int ans=0;
while(n){
ans+=n&1;
n>>1;
}
return ans;
}
};
二、461. 汉明距离
1.原题链接
2.题目描述
两个整数之间的 汉明距离 指的是这两个数字对应二进制位不同的位置的数目。给你两个整数 x 和 y,计算并返回它们之间的汉明距离。
3.解题思路
位运算
4.源码
class Solution {
public:
int hammingDistance(int x, int y) {
int z=x^y;
int ans=0;
while(z){
ans+=z&1;
z>>=1;
}
return ans;
}
};
三、136. 只出现一次的数字
1.原题链接
2.题目描述
给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。
3.解题思路
位运算,使用异或运算来解决
4.源码
class Solution {
public:
int singleNumber(vector<int>& nums) {
int ans=0;
for(int i=0;i<nums.size();++i){
ans^=nums[i];
}
return ans;
}
};
四、137. 只出现一次的数字 II
1.原题链接
2.题目描述
给你一个整数数组 nums ,除某个元素仅出现 一次 外,其余每个元素都恰出现 三次 。请你找出并返回那个只出现了一次的元素。
3.解题思路
1)思路一:将数组的每一个数进行二进制排列,对每一个位分别进行累加,再模3,如果余数为1,说明一次出现的数的二进制位上面为1,如果余数为零,则说明一次出现的数的二进制位上面为0,最后再将二进制数转化为十进制即可。
2)思路二:数字电路思想,假设有一个数x则有如下定律:
0 ^ x =x;
x ^ x = 0;
x & ~x = 0,
x & ~0 =x;
对于本题来说:一开始定义变量a = 0, b = 0;x第一次出现后,a = (a ^ x) & ~b的结果为 a = x, b = (b ^ x) & ~a的结果为此时因为a = x了,所以b = 0。x第二次出现:a = (a ^ x) & ~b, a = (x ^ x) & ~0, a = 0; b = (b ^ x) & ~a 化简, b = (0 ^ x) & ~0 ,b = x;x第三次出现:a = (a ^ x) & ~b, a = (0 ^ x) & ~x ,a = 0; b = (b ^ x) & ~a 化简, b = (x ^ x) & ~0 , b = 0;所以出现三次同一个数,a和b最终都变回了0.只出现一次的数,按照上面x第一次出现的规律可知a = x, b = 0;因此最后返回a.
4.源码
1)
class Solution {
public:
int singleNumber(vector<int>& nums) {
int ret=0;
for(int i=0;i<32;++i){
int ans=0;
for(int j =0;j<nums.size();++j){
ans+=(nums[j]>>i)&1;
}
ans%=3;
if(ans){
ret+=((unsigned int)1<<i);
}
}
return ret;
}
};
2)
class Solution {
public:
int singleNumber(vector<int>& nums) {
int a = 0, b = 0;
for (auto num : nums)
{
a = (a ^ num) & ~b;
b = (b ^ num) & ~a;
}
return a;
}
};
总结
第十天,位运算还需要加强。