
题目思路解析
这道题目要求我们读取一串以0结尾的数字序列,然后将其逆序输出(不包括结尾的0)。这是一个典型的数组逆序输出问题,考察对数组操作和输入输出的掌握。
核心思考路径
- 输入处理:读取以0结尾的数字序列
- 存储数字:将输入数字存入容器(数组/vector)
- 逆序输出:从后向前遍历容器,忽略结尾的0
关键考核知识点
1. 输入处理(⭐⭐⭐⭐⭐)
- 不定长输入:处理以特定值(0)结尾的输入序列
- 空格分隔:正确处理空格分隔的数字
- 数据类型 :处理
int
范围内的整数
2. 数据结构选择(⭐⭐⭐)
- 数组:固定大小,需预先估计最大容量
- vector:动态扩容,更灵活
- 栈:天然适合逆序操作
3. 输出控制(⭐⭐⭐)
- 逆序遍历:从后向前输出元素
- 空格处理:避免首尾多余空格
- 0值排除:不输出结尾的0
C++完整实现
解法一:使用vector动态存储
cpp
#include <iostream>
#include <vector>
using namespace std;
int main() {
vector<int> nums;
int num;
// 读取输入直到遇到0
while (cin >> num && num != 0) {
nums.push_back(num);
}
// 逆序输出
for (int i = nums.size() - 1; i >= 0; --i) {
if (i != nums.size() - 1) cout << " ";
cout << nums[i];
}
return 0;
}
解法二:使用固定数组
cpp
#include <iostream>
using namespace std;
int main() {
const int MAX_N = 100;
int nums[MAX_N];
int count = 0;
int num;
// 读取输入
while (cin >> num && num != 0) {
nums[count++] = num;
}
// 逆序输出
for (int i = count - 1; i >= 0; --i) {
if (i != count - 1) cout << " ";
cout << nums[i];
}
return 0;
}
代码解析与优化
1. 输入处理优化
cpp
// 使用更安全的输入方式
while (cin >> num) {
if (num == 0) break;
nums.push_back(num);
}
2. 输出格式优化
cpp
// 使用标志位控制空格
bool first = true;
for (int i = nums.size() - 1; i >= 0; --i) {
if (!first) cout << " ";
first = false;
cout << nums[i];
}
3. 复杂度分析
实现方式 | 时间复杂度 | 空间复杂度 | 优点 | 缺点 |
---|---|---|---|---|
vector | O(n) | O(n) | 灵活 | 动态分配开销 |
固定数组 | O(n) | O(n) | 速度快 | 需预估大小 |
测试用例分析
测试案例 | 输入 | 预期输出 | 验证要点 |
---|---|---|---|
案例1 | 3 65 23 5 34 1 3 0 | 3 1 34 5 23 65 3 | 常规情况 |
边界1 | 0 | (空) | 仅0输入 |
边界2 | 1 0 | 1 | 单数字 |
特殊1 | 1 2 3 4 5 0 | 5 4 3 2 1 | 递增序列 |
特殊2 | 5 4 3 2 1 0 | 1 2 3 4 5 | 递减序列 |
常见错误与修正
错误1:数组越界
cpp
// 错误:未检查数组边界
int nums[100];
int i = 0;
while (cin >> num && num != 0) {
nums[i++] = num; // 可能越界
}
修正:
cpp
if (i >= 100) break;
错误2:输出多余空格
cpp
// 错误:末尾多空格
for (int i = count-1; i >= 0; i--) {
cout << nums[i] << " ";
}
修正:
cpp
if (i != 0) cout << " ";
错误3:忽略输入结束条件
cpp
// 错误:无限循环
while (true) {
cin >> num;
nums.push_back(num);
}
修正:
cpp
while (cin >> num && num != 0)
竞赛技巧总结
- 输入终止条件:明确以0作为输入结束标志
- 容器选择:根据数据规模选择合适的数据结构
- 输出格式:特别注意空格和换行处理
- 边界测试:测试空输入、单元素输入等特殊情况
拓展思考
-
变形问题1:如果输入以特定字符串结束怎么办?
cppstring end_marker = "END"; string input; while (cin >> input && input != end_marker) { int num = stoi(input); nums.push_back(num); }
-
变形问题2:要求输出时每行一个数字
cppfor (int i = nums.size()-1; i >= 0; i--) { cout << nums[i] << endl; }
-
进阶挑战:处理超大数字(超过long long范围)
- 使用字符串存储数字
- 自定义大数比较和输出
"编程竞赛中,输入输出处理往往是基础但容易出错的部分。通过这道题,我们巩固了数组操作和格式控制的技巧。"
关注并私信【数字游戏】可获得资源:
- C++输入输出详解
- vector容器文档