前置知识
在进行位运算优化前,建议先熟悉基本的位操作符(与、或、异或、移位等)。它们不仅是底层逻辑的基础,更是解决特定算法问题的利器。
经典例题解析
判定字符是否唯一
这道题如果用哈希表,空间复杂度是 O(N)。利用位图思想,我们可以把空间压缩到 O(1)。一个 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';
// 检查该位是否已被置为 1
if(((bitmap >> e) & 1) == 1) return false;
// 将当前字符对应的位置 1
bitmap |= (1 << e);
}
return true;
}
};
消失的数字
数组包含 [0, n] 中缺失的一个数。核心在于异或的'消消乐'特性:相同数字异或为 0。将数组元素与完整序列 [0, n] 全部异或,成对的数字抵消,剩下的就是缺失值。
class Solution {
public:
int missingNumber(vector<int>& nums) {
int ret = 0;
// 先异或数组中的所有数
for( i : nums) ret ^= i;
( i = ; i <= nums.(); i++) ret ^= i;
ret;
}
};

