当前位置: 面试刷题>> 查找数组中没有出现的所有数字 (经典算法题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);
```
**码小课网站中有更多相关内容分享给大家学习**,涵盖各种编程语言的基础和进阶知识,以及实用的算法和数据结构讲解。