小鱼的数字游戏:C++实现与算法分析(洛谷P1427)

题目思路解析

这道题目要求我们读取一串以0结尾的数字序列,然后将其逆序输出(不包括结尾的0)。这是一个典型的数组逆序输出问题,考察对数组操作和输入输出的掌握。

核心思考路径

  1. 输入处理:读取以0结尾的数字序列
  2. 存储数字:将输入数字存入容器(数组/vector)
  3. 逆序输出:从后向前遍历容器,忽略结尾的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)

竞赛技巧总结

  1. 输入终止条件:明确以0作为输入结束标志
  2. 容器选择:根据数据规模选择合适的数据结构
  3. 输出格式:特别注意空格和换行处理
  4. 边界测试:测试空输入、单元素输入等特殊情况

拓展思考

  1. 变形问题1:如果输入以特定字符串结束怎么办?

    cpp 复制代码
    string end_marker = "END";
    string input;
    while (cin >> input && input != end_marker) {
        int num = stoi(input);
        nums.push_back(num);
    }
  2. 变形问题2:要求输出时每行一个数字

    cpp 复制代码
    for (int i = nums.size()-1; i >= 0; i--) {
        cout << nums[i] << endl;
    }
  3. 进阶挑战:处理超大数字(超过long long范围)

    • 使用字符串存储数字
    • 自定义大数比较和输出

"编程竞赛中,输入输出处理往往是基础但容易出错的部分。通过这道题,我们巩固了数组操作和格式控制的技巧。"

关注并私信【数字游戏】可获得资源

  • C++输入输出详解
  • vector容器文档
相关推荐
高山有多高2 小时前
栈:“后进先出” 的艺术,撑起程序世界的底层骨架
c语言·开发语言·数据结构·c++·算法
普罗米修斯3 小时前
C++ 设计模式理论与实战大全【共73课时】
c++·后端
YouEmbedded3 小时前
解码查找算法与哈希表
数据结构·算法·二分查找·散列表·散列查找·线性查找
普罗米修斯3 小时前
C++ 设计模式原理与实战大全-架构师必学课程 | 完结
c++·后端
greentea_20133 小时前
Codeforces Round 65 C. Round Table Knights(71)
c语言·开发语言·算法
小秋学嵌入式-不读研版3 小时前
C61-结构体数组
c语言·开发语言·数据结构·笔记·算法
可触的未来,发芽的智生3 小时前
触摸未来2025.10.04:当神经网络拥有了内在记忆……
人工智能·python·神经网络·算法·架构
与己斗其乐无穷4 小时前
刷题记录(11)map和set的简单使用
算法
夜月yeyue4 小时前
个人写HTOS移植shell
c++·mcu·算法·性能优化·架构·mfc