题解:洛谷 P1427 小鱼的数字游戏
【题目来源】
【题目描述】
小鱼最近被要求参加一个数字游戏,要求它把看到的一串数字 \(a_i\)(长度不一定,以 \(0\) 结束),记住了然后反着念出来(表示结束的数字 \(0\) 就不要念出来了)。这对小鱼的那点记忆力来说实在是太难了,你也不想想小鱼的整个脑袋才多大,其中一部分还是好吃的肉!所以请你帮小鱼编程解决这个问题。
【输入】
一行内输入一串整数,以 \(0\) 结束,以空格间隔。
【输出】
一行内倒着输出这一串整数,以空格间隔。
【输入样例】
3 65 23 5 34 1 30 0
【输出样例】
30 1 34 5 23 65 3
【核心思想】
-
问题分析:输入一串以
0结尾的整数序列,要求倒序输出除结尾0以外的所有整数。本质是一个序列存储与反向遍历问题,无需对数据进行任何修改或计算。 -
算法选择:
- 数组存储 + 倒序输出:使用数组按输入顺序存储所有非零整数,记录存储长度,然后从最后一个元素向前遍历输出。这种方法简单直接,时间复杂度 \(O(n)\),空间复杂度 \(O(n)\),适合任意长度的输入序列。
- 递归(可选):也可使用递归函数读入数字,遇到
0则返回,在回溯时输出,但数组方法更为直观。
-
关键步骤:
- 读入与存储:使用循环读入整数
t,若t != 0,则存入数组a[mark]并令mark++;若t == 0,则结束读入。 - 倒序输出:从
mark - 1到1遍历数组,逐个输出a[i],每个数字后跟一个空格。 - 输出格式:数字之间用空格分隔,末尾可跟空格(本题对格式要求不严格)。
- 读入与存储:使用循环读入整数
-
时间/空间复杂度:
- 时间复杂度:\(O(n)\),其中 \(n\) 是输入中非零整数的个数,只需遍历两次(读入一次,输出一次)。
- 空间复杂度:\(O(n)\),用于存储输入序列。
-
模拟与输出:
- 终止标志:
0作为输入结束的标志,不参与输出,这是题目明确要求的。 - 存储策略:使用数组存储所有有效数字,是因为需要反向访问,而单次遍历无法倒序输出,必须保存所有数据。
- 适用场景:这类“先存储后反向处理”的问题非常常见,适用于需要逆序输出或逆序操作的场景。
- 终止标志:
【算法标签】
入门 #模拟
【代码详解】
#include <bits/stdc++.h> // 包含标准库头文件(万能头文件)
using namespace std; // 使用标准命名空间
/**
* 主函数 - 程序入口
* @return 程序执行状态码(0表示成功)
*/
int main()
{
int a[105]; // 定义数组:存储输入的数字序列
int mark = 1; // 定义变量:数组索引标记,初始为1
int t; // 定义变量:临时存储输入的数字
// 循环读入数据到数组中,直到输入为0
cin >> t; // 读取第一个数字
while (t != 0) // 当输入不为0时继续循环
{
a[mark] = t; // 将当前数字存入数组
mark++; // 数组索引后移
cin >> t; // 读取下一个数字
}
// 倒序输出数组中的数字
for (int i = mark - 1; i >= 1; i--)
{
cout << a[i] << " "; // 输出当前数字
}
return 0; // 程序正常结束
}
【运行结果】
3 65 23 5 34 1 30 0
30 1 34 5 23 65 3
浙公网安备 33010602011771号