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

