前言
在算法面试和实际开发中,位运算往往是被低估的利器。它不仅能将空间复杂度优化到 O(1),还能在某些场景下显著提升执行效率。今天我们就通过几道经典的力扣题目,深入聊聊位运算的核心思想与实战应用。
一、判定字符是否唯一
题目: 给定一个字符串,判断其中所有字符是否都是唯一的。
思路: 利用【位图】的思想,每一个【比特位】代表一个【字符】。由于题目通常限定为小写字母,一个 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';
// 先判断字符是否出现过
if(((bitmap >> e) & 1) == 1) return false;
// 把当前字符加入到位图中
bitmap |= (1 << e);
}
return true;
}
};
二、消失的数字
题目: 数组包含 [0, n] 中缺失的一个数,找出这个缺失的数字。
思路: 设数组大小为 n,原本应该是 [0, n] 的序列。如果我们把数组中的所有数,以及 [0, n] 的所有数全部【异或】在一起,根据异或运算的【消消乐】规则(相同数字异或为 0),最终剩下的结果就是缺失的那个数字。
class Solution {
public:
int {
ret = ;
( i : nums) ret ^= i;
( i = ; i <= nums.(); i++) ret ^= i;
ret;
}
};

