[NOIP 2006 普及组] 明明的随机数
用 set 去重,再用 sorted 得到从小到大的不同随机数。
OJ: luogu
题目 ID: P1059
难度:入门
标签:排序去重python
日期: 2026-06-19 01:32
题意
给出 N 个 1..1000 的随机整数。去掉重复数字后,按从小到大输出。
思路
Python 中 set(numbers) 可以去重,但集合本身没有固定顺序。再用 sorted(...) 排序:
python
unique_numbers = sorted(set(numbers))然后输出不同数字个数和排序后的列表即可。
Python 知识
/home/rainboy/mycode/hugo-blog/content/program_language/python/collections_toolkit.md:set适合判重和去重。/home/rainboy/mycode/hugo-blog/content/program_language/python/sorting_and_ordering.md:sorted()返回一个新的有序列表。print(*unique_numbers)按空格展开输出列表。
代码
python
n = int(input())
numbers = list(map(int, input().split()))
unique_numbers = sorted(set(numbers))
print(len(unique_numbers))
print(*unique_numbers)Guide 风格代码
cppbook《C++ 快速入门》教学风格的写法(std:: 前缀、i += 1 循环、0 起始下标):
cpp
/**
* Author by Rainboy blog: https://rainboylv.com github: https://github.com/rainboylvx
* rbook: -> https://rbook.roj.ac.cn https://rbook2.roj.ac.cn
* rainboy的学习导航网站: https://idx.roj.ac.cn
* create_at: 2026-08-14 15:18
* update_at: 2026-08-14 15:18
*/
/* P1059 明明的随机数:布尔数组当桶用,相同的随机数只保留一个,再从小到大输出。 */
#include <iostream>
int main() {
const int max_value = 1000;
bool seen[max_value + 1]; // seen[x] = true 表示随机数 x 已经出现过
for (int i = 1; i <= max_value; i += 1) {
seen[i] = false;
}
int n;
std::cin >> n;
for (int i = 0; i < n; i += 1) {
int x;
std::cin >> x;
seen[x] = true; // 重复出现的数字只算一个
}
// 第一行输出不同数字的个数
int count = 0;
for (int i = 1; i <= max_value; i += 1) {
if (seen[i]) {
count += 1;
}
}
std::cout << count << '\n';
// 第二行按从小到大输出这些不同的数字
bool first = true;
for (int i = 1; i <= max_value; i += 1) {
if (seen[i]) {
if (!first) {
std::cout << ' ';
}
std::cout << i;
first = false;
}
}
std::cout << '\n';
return 0;
}Pythonic 写法
set 去重 sorted:
python
input()
nums = sorted(set(map(int, input().split())))
print(len(nums))
print(*nums)复杂度
设输入数量为 N,去重和排序总复杂度为
总结
去重后排序是 Python 的常见组合:sorted(set(a))。注意集合去重后要排序,不能直接输出集合。