1. 位运算算法精讲:从基础到实战应用
作为程序员面试中的常客,位运算因其高效性和巧妙性备受青睐。今天我将通过5道经典面试题,带大家深入理解位运算的核心原理和实际应用。这些题目覆盖了字符判重、缺失数字查找、无符号加法等常见场景,每道题都蕴含着独特的位运算技巧。
位运算之所以高效,是因为它直接操作内存中的二进制位,避免了常规算术运算的中间步骤。在算法面试中,合理运用位运算往往能将时间复杂度降至O(n),空间复杂度降至O(1)。
1.1 字符唯一性判断:位图法的精妙应用
1.1.1 问题分析与常规解法
判定字符串中字符是否唯一,最直观的方法是使用哈希表记录出现过的字符。但这种方法需要O(n)的额外空间,且哈希表本身有一定的性能开销。
java复制// 常规哈希表解法
public boolean isUnique(String s) {
Set<Character> set = new HashSet<>();
for (char c : s.toCharArray()) {
if (set.contains(c)) return false;
set.add(c);
}
return true;
}
1.1.2 位图法的核心思想
对于仅包含小写字母的字符串(a-z),我们可以用一个32位整数作为位图(bitmap),每个比特位代表一个字母是否出现过:
- 第0位代表'a'
- 第1位代表'b'
- ...
- 第25位代表'z'
这种表示法将空间复杂度从O(n)降到了O(1),仅需一个整型变量。
1.1.3 关键位运算操作详解
检查某位是否为1:
java复制// 检查第i位是否为1
(biteMap >> i) & 1 == 1
设置某位为1:
java复制// 将第i位设为1
biteMap |= (1 << i);
1.1.4 完整实现与优化
考虑到英文字母只有26个,根据鸽巢原理,当字符串长度超过26时必定有重复字符:
java复制public boolean isUnique(String s) {
if (s.length() > 26) r
