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;
}
代码分析:
tests[maxN]
用于标记哪些测试索引已经被使用。- 读取
n
的值,然后读取n
个索引并在tests[]
数组中标记。 - 依次检查从
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()
代码解析
- 使用
tests = [False] * maxN
创建一个布尔数组,存储哪些索引已经被使用。 - 读取
n
的值,并使用input().split()
读取n
个索引。 - 遍历索引,将其在
tests[]
数组中标记为True
。 - 从
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()
优化点
- 使用
set()
存储已使用的索引,查询时间复杂度降为 O(1)。 - 用
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. 总结
- 本题的核心思想是 寻找未被使用的最小正整数,可以使用数组标记法或集合法解决。
- C++ 的数组标记法 在 Python 中可以用 列表 代替,但更推荐用 集合 set(),可以提高查询效率并减少空间占用。
- 优化版本的 Python 代码 更加简洁易读,适合面试和竞赛环境。
希望这篇文章能帮助大家理解 A. Next Test 题目的解法,欢迎点赞、收藏和关注!