当前位置: 面试刷题>> 查找数组中没有出现的所有数字 (经典算法题500道)


### 完整题目描述 给定一个长度为 `n` 的整数数组 `nums`,其中 `nums` 的取值范围在闭区间 `[1, n]` 内(即数组中的每个数字都是 `1` 到 `n` 之间的一个整数),且数组中每个数字最多出现一次。请编写一个算法来找出数组中所有未出现的数字。 **要求**: - 算法的时间复杂度应为 O(n)。 - 算法的空间复杂度应尽可能低,最好为 O(1)(不考虑输出数组)。 ### 示例 **输入**:`nums = [4, 3, 2, 7, 8, 2, 3, 1]` **输出**:`[5, 6]` **解释**:数组 `nums` 包含了从 1 到 8 的整数,但其中缺少了 5 和 6。 ### PHP 示例代码 ```php function findDisappearedNumbers($nums) { $n = count($nums); $result = []; // 标记出现的数字 foreach ($nums as $num) { $index = abs($num) - 1; if ($nums[$index] > 0) { $nums[$index] *= -1; } } // 找出未标记(即未出现)的数字 for ($i = 0; $i < $n; $i++) { if ($nums[$i] > 0) { $result[] = $i + 1; } } return $result; } // 测试 $nums = [4, 3, 2, 7, 8, 2, 3, 1]; $result = findDisappearedNumbers($nums); print_r($result); ``` ### Python 示例代码 ```python def findDisappearedNumbers(nums): n = len(nums) result = [] # 标记出现的数字 for num in nums: index = abs(num) - 1 if nums[index] > 0: nums[index] *= -1 # 找出未标记(即未出现)的数字 for i in range(n): if nums[i] > 0: result.append(i + 1) return result # 测试 nums = [4, 3, 2, 7, 8, 2, 3, 1] result = findDisappearedNumbers(nums) print(result) ``` ### JavaScript 示例代码 ```javascript function findDisappearedNumbers(nums) { const n = nums.length; const result = []; // 标记出现的数字 for (let num of nums) { const index = Math.abs(num) - 1; if (nums[index] > 0) { nums[index] *= -1; } } // 找出未标记(即未出现)的数字 for (let i = 0; i < n; i++) { if (nums[i] > 0) { result.push(i + 1); } } return result; } // 测试 const nums = [4, 3, 2, 7, 8, 2, 3, 1]; const result = findDisappearedNumbers(nums); console.log(result); ``` **码小课网站中有更多相关内容分享给大家学习**,涵盖各种编程语言的基础和进阶知识,以及实用的算法和数据结构讲解。
推荐面试题