常见位运算参考
在深入具体题目之前,先回顾几个常用的位运算技巧,这对后续解题至关重要。
清除最右侧的 1
利用 n & (n - 1) 可以消除整数二进制表示中最右侧的一个 1。这在计算汉明重量或统计 1 的个数时非常高效。
class Solution {
public:
int hammingWeight(int n) {
int count = 0;
while (n) {
n &= (n - 1);
count++;
}
return count;
}
};
比特位计数与汉明距离
对于统计 0 到 n 每个数的 1 的个数,可以利用动态规划或复用之前的结果。汉明距离则是两个数异或后统计 1 的个数。
class Solution {
public:
vector<int> countBits(int n) {
vector<int> ans(n + 1, 0);
for (int i = 1; i <= n; i++) {
ans[i] = ans[i >> 1] + (i & 1);
}
return ans;
}
};
033 判断字符是否唯一
题目描述: 给定一个字符串,判断其中所有字符是否都是唯一的。要求不使用额外的数据结构。
解题思路
我们可以利用「位图」的思想。假设只包含小写字母,一个 32 位的整数足以容纳 26 个字母的状态。每一位代表一个字符是否出现过:0 表示未出现,1 表示已出现。
此外,如果字符串长度超过 26,根据鸽巢原理,必然存在重复字符,可直接返回 false。
代码实现
class Solution {
public:
{
(astr.() > ) ;
bitMap = ;
( ch : astr) {
i = ch - ;
((bitMap >> i) & ) ;
bitMap |= ( << i);
}
;
}
};


