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


完整题目描述

给定一个长度为 n 的整数数组 nums,其中 nums 的取值范围在闭区间 [1, n] 内(即数组中的每个数字都是 1n 之间的一个整数),且数组中每个数字最多出现一次。请编写一个算法来找出数组中所有未出现的数字。

要求

  • 算法的时间复杂度应为 O(n)。
  • 算法的空间复杂度应尽可能低,最好为 O(1)(不考虑输出数组)。

示例

输入nums = [4, 3, 2, 7, 8, 2, 3, 1]

输出[5, 6]

解释:数组 nums 包含了从 1 到 8 的整数,但其中缺少了 5 和 6。

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 示例代码

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 示例代码

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);

码小课网站中有更多相关内容分享给大家学习,涵盖各种编程语言的基础和进阶知识,以及实用的算法和数据结构讲解。

推荐面试题