题目:查找数组中缺失的数字
描述:给定一个包含 0 到 n 的整数的数组,其中 n 是数组的长度。数组中可能会缺少一个数字,并且没有重复的数字。编写一个函数,接受这个数组作为参数,并返回缺失的数字。
示例: 输入:[3, 0, 1] 输出:2
输入:[9, 6, 4, 2, 3, 5, 7, 0, 1] 输出:8
你可以使用任何适合的方法来解决这个问题。请在回答中提供代码和解释。
答案一
function findMissingNumber(nums) {
const n = nums.length; // 计算数组中所有数字的总和
let totalSum = (n * (n + 1)) / 2; // 计算数组中实际数字的总和
let arraySum = nums.reduce((sum, num) => sum + num, 0); // 缺失的数字即为总和的差值
return totalSum - arraySum;
}
// 示例测试
console.log(findMissingNumber([3, 0, 1])); // 输出:2
console.log(findMissingNumber([9, 6, 4, 2, 3, 5, 7, 0, 1])); // 输出:8
解题思路:
- 使用等差数列的求和公式计算 0 到 n 的整数的总和。
- 遍历数组,将数组中所有数字相加,得到数组中实际数字的总和。
- 缺失的数字即为总和的差值。
该解法的时间复杂度为 O(n),其中 n 是数组的长度。
答案二
function findMissingNumber(nums) {
const n = nums.length; // 将数组中的数字进行异或操作
let xor = 0;
for (let i = 0; i < n; i++) {
xor ^= nums[i];
} // 再与 0 到 n 的整数进行异或操作
for (let i = 1; i <= n; i++) {
xor ^= i;
} // 最后得到的结果即为缺失的数字
return xor;
}
// 示例测试
console.log(findMissingNumber([3, 0, 1])); // 输出:2
console.log(findMissingNumber([9, 6, 4, 2, 3, 5, 7, 0, 1])); // 输出:8
解题思路:
- 使用异或运算符(^)将数组中的所有数字进行异或操作。
- 再与 0 到 n 的整数进行异或操作,这样相同的数字会抵消,最终得到缺失的数字。
该解法的时间复杂度也是 O(n),其中 n 是数组的长度。它利用了异或运算的性质,不需要额外的空间。