题解
奇数递增序列
1 条题解
-
0
P4667 奇数递增序列(入门)
解题思路
第一步,筛选出所有奇数。 依次读入每一个数,判断它是不是奇数:一个数除以 2 的余数是 1,就是奇数。比如 7 除以 2 余 1,是奇数;8 除以 2 余 0,是偶数。如果是奇数,就把它放进装奇数的小数组 oddNums,并用计数器 oddCount 记下已经收集了几个;如果是偶数,直接跳过,不影响结果。
第二步,从小到大排序。 全部数读完后,用 sort 把 oddNums 数组里前 oddCount 个数从小到大排好。sort 需要两个参数:起点 oddNums 和终点 oddNums + oddCount,表示排下标 0 到 oddCount-1 这 oddCount 个数,这是"左闭右开"的写法。
第三步,按要求输出。 依次输出 oddNums[0] 到 oddNums[oddCount-1],相邻两个数之间用一个空格隔开,最后一个数后面不跟空格,最后输出换行。可以用一个小技巧:除了第一个数,每个数前面先输出一个空格,这样就不会有多余空格了。
想一想生活里的例子。 班级里做游戏,先让戴红帽子的同学出列,这就是"筛选";再让他们按身高从矮到高站好队,这就是"排序"。
边界情况: 题目保证至少有一个奇数,输出不会空;N 最大 500,奇数最多也是 500 个,数组开 505 足够。
参考代码
// P4667 奇数递增序列:挑出所有奇数,升序排序后输出 #include <iostream> #include <algorithm> int main() { int n, num, oddNums[505], oddCount = 0; std::cin >> n; for (int i = 0; i < n; i++) { std::cin >> num; if (num % 2 == 1) oddNums[oddCount++] = num; // 只保留奇数 } std::sort(oddNums, oddNums + oddCount); for (int i = 0; i < oddCount; i++) { if (i) std::cout << " "; std::cout << oddNums[i]; } std::cout << "\n"; return 0; }复杂度分析
读入 N 个数并筛选是 O(N),排序 O(oddCount log oddCount),oddCount 是奇数的个数,最多 500。总时间复杂度 O(N + oddCount log oddCount),非常快。空间上需要一个存原数的变量和一个存奇数的小数组,O(oddCount)。这道题主要是练习"筛选 + 排序"的组合思路。
- 1