📖 位运算专题怎么用?
XOR(异或)是面试中的"装逼武器"——一行代码 O(1) 空间解决问题,面试官看到就知道你懂位运算。
本专题包含 2 道题,都是外企面试高频真题。每道题按统一结构讲解:
- 题目描述 — 用人话翻译,不用读三遍才懂
- 生活类比 — 把抽象问题变成熟悉的生活场景
- 暴力思路 → 优化思路 — 面试官想看到的思考过程
- IDE 代码 — 带注释的 JS 实现 + 行号
- 复杂度分析 — 时间/空间,面试必问
- 面试加分项 — 能说出来的额外思考
复习建议:先看生活类比理解问题本质,再看思路建立解题框架,最后手写代码 3 遍形成肌肉记忆。面试时先口述思路,确认无误后再写代码。
1只出现一次的数字 (Single Number) Easy
题目(人话版)
数组里每个数字都出现了两次,只有一个数字出现了一次。找出那个单独的数字。[4,1,2,1,2] → 答案是 4。要求 O(n) 时间 + O(1) 空间。
💡 生活类比:想象一个派对——所有人都是成双成对来的(2个人一组),只有你是一个人来的。怎么找出你?让所有人排成一排,两两抵消,最后剩下那个就是你。XOR(异或)运算就是"两两抵消"的数学工具。
XOR 回顾
| 运算 | 结果 | 口诀 |
| 0 XOR 0 | 0 | 相同→0 |
| 1 XOR 1 | 0 | 相同→0 |
| 0 XOR 1 | 1 | 不同→1 |
| a XOR a | 0 | 自己和自己抵消 |
| a XOR 0 | a | 和 0 异或不变 |
所以:4 XOR 1 XOR 2 XOR 1 XOR 2 = 4 XOR (1 XOR 1) XOR (2 XOR 2) = 4 XOR 0 XOR 0 = 4!成对的全部抵消了。
singleNumber.js
function singleNumber(nums) {
let result = 0;
for (const num of nums) {
result ^= num; // 全部 XOR 一遍
}
return result;
// 成对的抵消为 0,剩下的就是唯一的那个
}
时间 O(n),空间 O(1)。一行核心代码,面试官看到 XOR 就知道你懂位运算。
面试加分:主动说"暴力法用哈希表统计也可以,O(n) 时间但 O(n) 空间。XOR 的优势是 O(1) 空间——不额外占内存。面试官问'还有别的方法吗'时主动说出 XOR 会让面试官眼前一亮。"
2缺失数字 (Missing Number) Easy
题目(人话版)
给你 [3,0,1],数字范围是 0~3(共 4 个数),但数组只有 3 个。缺了哪个?答案是 2。
💡 生活类比:一盒扑克牌本来有 0~n 共 n+1 张,现在丢了一张。怎么找?算"应该的总和"减去"实际的总和",差值就是丢的那张。比如 0+1+2+3=6,实际只有 3+0+1=4,6-4=2,丢的是 2。
方法一:数学公式法
missingNumber-math.js
function missingNumber(nums) {
const n = nums.length;
// 0~n 的和 = n*(n+1)/2 (等差数列求和公式)
const expectedSum = n * (n + 1) / 2;
const actualSum = nums.reduce((a, b) => a + b, 0);
return expectedSum - actualSum;
}
方法二:XOR 法
把数组的每个数和 0~n 的每个数全部 XOR,成对出现的抵消,剩下的就是缺失的。
missingNumber-xor.js
function missingNumber(nums) {
let result = nums.length; // 先放 n
for (let i = 0; i < nums.length; i++) {
result ^= i ^ nums[i]; // 索引和值一起 XOR
}
return result;
}
// [3,0,1]: result = 3 ^ (0^3) ^ (1^0) ^ (2^1) = 2
两种方法都是 O(n) 时间 O(1) 空间。数学法更直觉,XOR 法更装逼。
📋 位运算专题速查表
| # | 题目 | 难度 |
| 1 | 只出现一次的数字 (Single Number) | Easy |
| 2 | 缺失数字 (Missing Number) | Easy |
考点核心:位运算专题的核心就是"用对工具,降复杂度"。
面试时拿到题先想:"这道题能用位运算吗?"
如果能,先说思路再写代码,面试官就知道你的分析能力。
🔗 其他考点专题
→ 双指针专题:回文检测 (Valid Palindrome), 反转字符串 (Reverse String), 合并两个有序数组 (Merge Sorted Arrays), 移动零 (Move Zeroes)
→ 哈希表专题:两数之和 (Two Sum), 有效的字母异位词 (Valid Anagram), 数组去重/判断有重复 (Contains Duplicate), 第一个唯一字符 (First Unique Character)
→ 动态规划专题:斐波那契数列 (Fibonacci), 爬楼梯 (Climbing Stairs), 最大子序和 (Max Subarray)
→ 栈与滑动窗口专题:有效括号 (Valid Parentheses), 最长不重复子串 (Longest Substring)
→ 综合技巧专题:FizzBuzz, 买卖股票的最佳时机 (Best Time to Buy/Sell Stock), 多数元素 (Majority Element), 旋转数组 (Rotate Array), 二分查找 (Binary Search)
← 返回图解算法与模式