【每日一题】查找数组中缺失的数字

200 阅读2分钟

题目:查找数组中缺失的数字

描述:给定一个包含 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

解题思路:

  1. 使用等差数列的求和公式计算 0 到 n 的整数的总和。
  2. 遍历数组,将数组中所有数字相加,得到数组中实际数字的总和。
  3. 缺失的数字即为总和的差值。

该解法的时间复杂度为 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

解题思路:

  1. 使用异或运算符(^)将数组中的所有数字进行异或操作。
  2. 再与 0 到 n 的整数进行异或操作,这样相同的数字会抵消,最终得到缺失的数字。

该解法的时间复杂度也是 O(n),其中 n 是数组的长度。它利用了异或运算的性质,不需要额外的空间。