LeetCode 面试题 17.19. 消失的两个数字
题目描述
思路分析
解法一:按位异或拆分(推荐)
核心思路:
- 设缺失的两个数为
a和b,对1..n与数组所有元素异或,可得xor = a ^ b。- 取
xor的最低位 1,把所有数按该位分成两组,分别异或即可得到a和b。- 最后按需调整输出顺序。
复杂度分析:
- 时间复杂度:O(n),其中 n 为完整数组长度。
- 空间复杂度:O(1),仅使用常数额外空间。
class Solution {
public int[] missingTwo(int[] nums) {
int n = nums.length + 2;
int xor = 0;
for (int i = 1; i <= n; i++) {
xor ^= i;
}
for (int num : nums) {
xor ^= num;
}
int lowbit = xor & -xor;
int a = 0;
int b = 0;
for (int i = 1; i <= n; i++) {
if ((i & lowbit) == 0) {
a ^= i;
} else {
b ^= i;
}
}
for (int num : nums) {
if ((num & lowbit) == 0) {
a ^= num;
} else {
b ^= num;
}
}
if (a > b) {
int tmp = a;
a = b;
b = tmp;
}
return new int[]{a, b};
}
}
func missingTwo(nums []int) []int {
n := len(nums) + 2
xor := 0
for i := 1; i <= n; i++ {
xor ^= i
}
for _, num := range nums {
xor ^= num
}
lowbit := xor & -xor
a, b := 0, 0
for i := 1; i <= n; i++ {
if i&lowbit == 0 {
a ^= i
} else {
b ^= i
}
}
for _, num := range nums {
if num&lowbit == 0 {
a ^= num
} else {
b ^= num
}
}
if a > b {
a, b = b, a
}
return []int{a, b}
}
相似题目
| 题目 | 难度 | 考察点 |
|---|---|---|
| 268. 丢失的数字 | 简单 | 位运算 |
| 260. 只出现一次的数字 III | 中等 | 位运算 |
| 136. 只出现一次的数字 | 简单 | 位运算 |
| 645. 错误的集合 | 简单 | 位运算 |
| 448. 找到所有数组中消失的数字 | 简单 | 哈希/原地标记 |
本博客所有文章除特别声明外,均采用
CC BY-NC-SA 4.0
许可协议,转载请注明出处!