leetcode 100热题位运算篇
338比特位计数
算法
(递推) O(n)
f[i] 表示的是 i 的二进制中 1 的个数
递推式 f[i] = f[i >> 1] + (i & 1)
,先计算右移一位的二进制表示中 1 的个数,然后再加个最后一位。
时间复杂度
O(n)
空间复杂度
O(n)
代码
class Solution {
public:
vector<int> countBits(int n) {
vector<int> f(n + 1);
//f(0) = 0
for(int i = 1;i <= n;i++)s
//计算右移一位的二进制表示中 1 的个数,然后再加个最后一位
f[i] = f[i >> 1] + (i & 1);
return f;
}
};
【位运算三行代码求解】136. 只出现一次的数字
解题思路
(位运算) O(n)
题目已知除了某个元素只出现一次以外,其余每个元素均出现两次,那么将所有数进行异或操作最后的剩下的数就是答案。0 异或 任何数 = 任何数 一个数 异或 同一个数 = 0
时间复杂度
O(n)
空间复杂度
O(1)
代码
class Solution {
public:
int singleNumber(vector<int>& nums) {
int res = 0;
for(int i = 0;i < nums.size();i++)
{
res ^= nums[i];
}
return res;
}
};
【位运算】461. 汉明距离
解题思路
(位运算) O(n)
当 x 和 y 有一个不为 0,就取它们的低位异或值加到答案中,对应二进制相同则加 0,否则加 1,然后 x、y 右移一位,直到两个数都为 0 为止。
时间复杂度
O(n),n 为二进制位的个数,最大为 32。
空间复杂度
O(1)
代码
class Solution {
public:
int hammingDistance(int x, int y) {
int res = 0;
//计算两个数字对应二进制位不同的位置的数目
while(x | y)
{
// 取它们的低位异或值加到答案中,对应二进制相同则加 0,否则加 1
res += (x & 1) ^ (y & 1);
x >>= 1;
y >>= 1;
}
return res;
}
};