位运算在算法优化中的实战应用
位运算往往是提升代码性能的关键,尤其在处理底层数据或需要极致空间效率的场景下。通过巧妙利用异或、与、或等基础操作,我们可以在 O(1) 的空间复杂度下解决许多看似复杂的问题。下面结合几个经典力扣题目,梳理一下位运算的核心技巧。
1. 判定字符是否唯一
题目链接: LeetCode - Is Unique LCCI
解题思路
这道题的核心在于【位图】思想。既然只需要判断小写字母是否重复,而一个 int 类型有 32 位,足够容纳 26 个字母的映射状态。我们可以用一个整数充当哈希表:某一位为 0 表示该字符未出现,为 1 则表示已出现。
这里有个细节需要注意,如果字符串长度超过 26,根据鸽巢原理必然存在重复,可以直接返回 false,无需后续计算。
class Solution {
public:
bool isUnique(string astr) {
// 利用鸽巢原理优化
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;
}
};
2. 消失的数字
题目链接: LeetCode - Missing Number
解题思路
数组长度为 n,包含 0 到 n 中缺失的一个数。利用【异或】运算的特性:相同数字异或为 0,任何数与 0 异或为其本身。
如果我们把数组中的所有元素,以及 0 到 n 的所有数字全部异或在一起,成对出现的数字会相互抵消,最终剩下的就是那个缺失的数字。

