题解
数字去重输出
1 条题解
-
0
解题思路
题目说数字都在 1~100 之间,这是一个很好的条件:我们可以用“标记数组”来去重。
准备一个长度为 101 的标记数组 used(下标 0 不用),每读到一个数字 x,就把 used[x] 标成 true,表示 x 出现过。
怎么做到“按从小到大输出”且“重复的只输出一次”? 非常简单:从 1 到 100 从小到大扫描,凡是 used[i] 为 true 就把 i 输出出来。 因为扫描方向是从小到大,所以输出自动排好序;因为每个数只标记一次、只输出一次,所以自然去重。
参考代码
// 数字去重输出:数字范围1~100,标记出现过的,按从小到大只输出一次 #include <iostream> using namespace std; bool used[101]; int main() { int n; cin >> n; for (int i = 0; i < n; i++) { int x; cin >> x; used[x] = true; // 这个数出现过 } bool first = true; for (int i = 1; i <= 100; i++) { // 从小到大枚举所有可能值 if (used[i]) { if (!first) cout << ' '; cout << i; first = false; } } cout << endl; return 0; }复杂度分析
读入 n 个数需要 O(n),从 1 扫到 100 是常数时间,总时间复杂度 O(n)。标记数组大小固定,空间复杂度 O(1)。
- 1