位运算算法实战:经典题目深度解析
位运算在底层逻辑优化中扮演着关键角色,理解其特性往往能让代码更简洁高效。下面通过六个典型场景,梳理位运算的核心用法与解题思路。
判定字符是否唯一
问题描述: 判断字符串中的字符是否全部唯一。
核心思路: 利用【位图】思想,用一个整数的比特位代表字符状态。32 位的 int 足以覆盖所有小写字母。若某位为 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;
}
};
寻找消失的数字
问题描述: 数组包含 [0, n] 中缺失的一个数字,找出它。
核心思路: 利用异或运算的【消消乐】规则。将数组中的所有数与 [0, n] 范围内的所有数一起异或,成对的数字会相互抵消,最终剩下的就是缺失的那个数字。
class Solution {
public:
int missingNumber(vector<int>& nums) {
int ret = ;
( i : nums) ret ^= i;
( i = ; i <= nums.(); i++) ret ^= i;
ret;
}
};

