# [268. 丢失的数字](https://leetcode.cn/problems/missing-number) [English Version](/solution/0200-0299/0268.Missing%20Number/README_EN.md) ## 题目描述 <!-- 这里写题目描述 --> <p>给定一个包含 <code>[0, n]</code> 中 <code>n</code> 个数的数组 <code>nums</code> ,找出 <code>[0, n]</code> 这个范围内没有出现在数组中的那个数。</p> <ul> </ul> <p> </p> <p><strong>示例 1:</strong></p> <pre> <strong>输入:</strong>nums = [3,0,1] <strong>输出:</strong>2 <b>解释:</b>n = 3,因为有 3 个数字,所以所有的数字都在范围 [0,3] 内。2 是丢失的数字,因为它没有出现在 nums 中。</pre> <p><strong>示例 2:</strong></p> <pre> <strong>输入:</strong>nums = [0,1] <strong>输出:</strong>2 <b>解释:</b>n = 2,因为有 2 个数字,所以所有的数字都在范围 [0,2] 内。2 是丢失的数字,因为它没有出现在 nums 中。</pre> <p><strong>示例 3:</strong></p> <pre> <strong>输入:</strong>nums = [9,6,4,2,3,5,7,0,1] <strong>输出:</strong>8 <b>解释:</b>n = 9,因为有 9 个数字,所以所有的数字都在范围 [0,9] 内。8 是丢失的数字,因为它没有出现在 nums 中。</pre> <p><strong>示例 4:</strong></p> <pre> <strong>输入:</strong>nums = [0] <strong>输出:</strong>1 <b>解释:</b>n = 1,因为有 1 个数字,所以所有的数字都在范围 [0,1] 内。1 是丢失的数字,因为它没有出现在 nums 中。</pre> <p> </p> <p><strong>提示:</strong></p> <ul> <li><code>n == nums.length</code></li> <li><code>1 <= n <= 10<sup>4</sup></code></li> <li><code>0 <= nums[i] <= n</code></li> <li><code>nums</code> 中的所有数字都 <strong>独一无二</strong></li> </ul> <p> </p> <p><strong>进阶:</strong>你能否实现线性时间复杂度、仅使用额外常数空间的算法解决此问题?</p> ## 解法 <!-- 这里可写通用的实现逻辑 --> **方法一:位运算** 对于数组中的每个元素,都可以与下标进行异或运算,最终的结果就是缺失的数字。 时间复杂度 $O(n)$,空间复杂度 $O(1)$。其中 $n$ 为数组长度。 **方法二:数学** 我们也可以用数学求解。求出 $[0,..n]$ 的和,减去数组中所有数的和,就得到了缺失的数字。 时间复杂度 $O(n)$,空间复杂度 $O(1)$。其中 $n$ 为数组长度。 <!-- tabs:start --> ### **Python3** <!-- 这里可写当前语言的特殊实现逻辑 --> ```python class Solution: def missingNumber(self, nums: List[int]) -> int: return reduce(xor, (i ^ v for i, v in enumerate(nums, 1))) ``` ```python class Solution: def missingNumber(self, nums: List[int]) -> int: n = len(nums) return (1 + n) * n // 2 - sum(nums) ``` ### **Java** <!-- 这里可写当前语言的特殊实现逻辑 --> ```java class Solution { public int missingNumber(int[] nums) { int n = nums.length; int ans = n; for (int i = 0; i < n; ++i) { ans ^= (i ^ nums[i]); } return ans; } } ``` ```java class Solution { public int missingNumber(int[] nums) { int n = nums.length; int ans = n; for (int i = 0; i < n; ++i) { ans += i - nums[i]; } return ans; } } ``` ### **C++** ```cpp class Solution { public: int missingNumber(vector<int>& nums) { int n = nums.size(); int ans = n; for (int i = 0; i < n; ++i) { ans ^= (i ^ nums[i]); } return ans; } }; ``` ```cpp class Solution { public: int missingNumber(vector<int>& nums) { int n = nums.size(); return (1 + n) * n / 2 - accumulate(nums.begin(), nums.end(), 0); } }; ``` ### **Go** ```go func missingNumber(nums []int) (ans int) { n := len(nums) ans = n for i, v := range nums { ans ^= (i ^ v) } return } ``` ```go func missingNumber(nums []int) (ans int) { n := len(nums) ans = n for i, v := range nums { ans += i - v } return } ``` ### **JavaScript** ```js /** * @param {number[]} nums * @return {number} */ var missingNumber = function (nums) { const n = nums.length; let ans = n; for (let i = 0; i < n; ++i) { ans ^= i ^ nums[i]; } return ans; }; ``` ```js /** * @param {number[]} nums * @return {number} */ var missingNumber = function (nums) { const n = nums.length; let ans = n; for (let i = 0; i < n; ++i) { ans += i - nums[i]; } return ans; }; ``` ### **PHP** ```php class Solution { /** * @param Integer[] $nums * @return Integer */ function missingNumber($nums) { $n = count($nums); $sumN = (($n + 1) * $n) / 2; for ($i = 0; $i < $n; $i++) { $sumN -= $nums[$i]; } return $sumN; } } ``` ### **...** ``` ``` <!-- tabs:end -->