每天学习一点算法 2026/01/26
题目:缺失数字
给定一个包含
[0, n]中n个数的数组nums,找出[0, n]这个范围内没有出现在数组中的那个数。
-
最容易想到的方法就是排序遍历找出缺失的数字,先对数组进行排序比较元素和下标,如果不等就是缺失的数字,如果遍历完成说明缺失的是数字 n
typescriptfunction missingNumber(nums: number[]): number { nums.sort((a, b) => a - b) for (let i = 0; i < nums.length; i++) { if (i !== nums[i]) { return i } } return nums.length }; -
因为完整的
[0, n]是连续整数,我们可以计算出完整范围所有数字的总和,再遍历求和nums中的数字,两者之差就是缺失的数字。typescriptfunction missingNumber(nums: number[]): number { const sum = nums.length * (nums.length + 1) / 2 let arrSum = 0 for (let i = 0; i < nums.length; i++) { arrSum += nums[i] } return sum - arrSum }; -
此外我们还可以利用位运算来解决这个问题
我们知道
a ^ a = 0, a ^ 0 = a, 0 ^ a = a,数组排序后所有元素进行异或运算结果和排序前的结果是一样的,那我们将[1, n]所有数字跟nums里的所有数字进行异或运算,结果就是nums缺失的数字。typescriptfunction missingNumber(nums: number[]): number { let a = 0 for (let i = 0; i < nums.length; i++) { a ^= nums[i] ^ (i + 1) } return a };
题目来源:力扣(LeetCode)