A. Next Test 题解与代码实现

1. 题目描述

「Polygon」是一个能够创建编程任务的系统,它可以以简单专业的方式帮助用户生成问题的测试数据。当你向问题添加一个测试时,对应的表单会询问下一个测试的索引。

在大多数情况下,下一个测试索引可以被系统自动推荐,它的默认值是 未使用的最小正整数。你需要编写一个程序,给定已存在测试的索引,找出下一个可用的测试索引。

输入

  • 第一行包含一个整数 n (1 ≤ n ≤ 3000),表示已经添加的测试数量。
  • 第二行包含 n 个不同的整数 a1, a2, ..., an (1 ≤ ai ≤ 3000),表示这些测试的索引。

输出

  • 输出下一个默认的测试索引,即未被使用的最小正整数。

2. 示例解析

输入示例

3
1 7 2

输出示例

3

解析

  • 已有的测试索引为 {1, 2, 7}
  • 按照规则,我们需要找出最小的未被使用的正整数。
  • 1 已被使用,2 也被使用,3 尚未使用,因此答案是 3

3. C++ 代码(原始实现)

题目最初的 C++ 代码如下:

#include <cstdio>

int main() {
    const int maxN = 3002;
    bool tests[maxN] = {0};

    int n(0); 
    scanf("%d", &n);
    
    for (int k = 0; k < n; k++) {
        int temp; 
        scanf("%d", &temp); 
        tests[temp] = 1;
    }

    for (int index = 1; index < maxN; index++) {
        if (!tests[index]) {
            printf("%d\n", index); 
            break;
        }
    }
    return 0;
}

代码分析:

  1. tests[maxN] 用于标记哪些测试索引已经被使用。
  2. 读取 n 的值,然后读取 n 个索引并在 tests[] 数组中标记。
  3. 依次检查从 1 开始的索引,找到第一个未被标记的数字并输出。

4. Python 代码实现

Python 版本的实现如下:

def find_missing_test():
    maxN = 3002  # 定义最大索引范围
    tests = [False] * maxN  # 初始化一个布尔数组,默认值为 False

    # 读取输入
    n = int(input("请输入测试总数: "))
    test_indices = list(map(int, input("请输入测试索引: ").split()))

    # 标记已使用的索引
    for temp in test_indices:
        tests[temp] = True

    # 查找最小的未使用索引
    for index in range(1, maxN):
        if not tests[index]:
            print(index)
            break

if __name__ == "__main__":
    find_missing_test()

代码解析

  1. 使用 tests = [False] * maxN 创建一个布尔数组,存储哪些索引已经被使用。
  2. 读取 n 的值,并使用 input().split() 读取 n 个索引。
  3. 遍历索引,将其在 tests[] 数组中标记为 True
  4. 1 开始检查 tests[] 数组,第一个为 False 的索引即为答案。

5. Python 代码优化

虽然上述代码已经可以正确运行,但 Python 有更简洁的写法,我们可以用 set 数据结构进行优化:

def find_missing_test():
    n = int(input("请输入测试总数: "))
    test_indices = set(map(int, input("请输入测试索引: ").split()))  # 直接使用集合去重

    # 从 1 开始找最小的未使用正整数
    index = 1
    while index in test_indices:
        index += 1

    print(index)

if __name__ == "__main__":
    find_missing_test()

优化点

  1. 使用 set() 存储已使用的索引,查询时间复杂度降为 O(1)。
  2. while 直接查找最小未使用的索引,避免使用 3002 长度的数组,减少内存占用。

6. 复杂度分析

方法时间复杂度空间复杂度
数组标记法O(n)O(3002) ≈ O(1)
集合查找法O(n)O(n)

在实际应用中,两种方法的时间复杂度均为 O(n),但集合查找法的空间占用更低,适用于更大的数据范围。


7. 测试数据

你可以使用以下输入测试代码:

测试用例 1

输入:
3
1 7 2

输出:
3

测试用例 2

输入:
5
2 4 1 5 6

输出:
3

测试用例 3

输入:
10
1 2 3 4 5 6 7 8 9 10

输出:
11

8. 总结

  1. 本题的核心思想是 寻找未被使用的最小正整数,可以使用数组标记法或集合法解决。
  2. C++ 的数组标记法 在 Python 中可以用 列表 代替,但更推荐用 集合 set(),可以提高查询效率并减少空间占用。
  3. 优化版本的 Python 代码 更加简洁易读,适合面试和竞赛环境。

希望这篇文章能帮助大家理解 A. Next Test 题目的解法,欢迎点赞、收藏和关注!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值