1. 前置知识
在深入具体题目之前,建议熟悉基本的位操作符(与、或、异或、移位)及其优先级。

2. 实战题解
2.1 判定字符是否唯一
思路解析: 利用【位图】思想,每一个【比特位】代表一个【字符】。一个 int 类型的变量有 32 位,足够表示所有的小写字母。若某位为 0,表示该字符未出现;若为 1,则表示已出现过。我们可以用一个整数充当哈希表来优化空间。
class Solution {
public:
bool isUnique(string astr) {
// 利用鸽巢原理优化,超过 26 个字符必有重复
if (astr.size() > 26) return false;
int bitmap = 0;
for (auto i : astr) {
int e = i - 'a';
// 先判断字符是否出现过
if (((bitmap >> e) & 1) == 1) return false;
// 把当前字符加入到位图中
bitmap |= 1 << e;
}
return true;
}
};
2.2 消失的数字
思路解析: 设数组大小为 n,原序列应为 [0, n],现缺失一个数。若将数组中的所有数与 [0, n] 的所有数全部【异或】在一起,根据【异或】运算的【消消乐】规则(相同为 0),最终结果即为缺失的数字。
class Solution {
public:
int {
ret = ;
( i : nums) ret ^= i;
( i = ; i <= nums.(); i++) ret ^= i;
ret;
}
};

