小鱼的数字游戏: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容器文档
相关推荐
2501_9403152610 小时前
leetcode182动态口令(将字符的前几个元素放在字符串后面)
算法
安全二次方security²10 小时前
CUDA C++编程指南(7.25)——C++语言扩展之DPX
c++·人工智能·nvidia·cuda·dpx·cuda c++编程指南
老鼠只爱大米10 小时前
LeetCode经典算法面试题 #98:验证二叉搜索树(递归法、迭代法等五种实现方案详解)
算法·leetcode·二叉树·递归·二叉搜索树·迭代
爱装代码的小瓶子10 小时前
【c++与Linux基础】文件篇(4)虚拟文件系统VFS
linux·开发语言·c++
疯狂的喵15 小时前
C++编译期多态实现
开发语言·c++·算法
scx2013100416 小时前
20260129LCA总结
算法·深度优先·图论
2301_7657031416 小时前
C++中的协程编程
开发语言·c++·算法
m0_7487080516 小时前
实时数据压缩库
开发语言·c++·算法
小魏每天都学习16 小时前
【算法——c/c++]
c语言·c++·算法
智码未来学堂16 小时前
探秘 C 语言算法之枚举:解锁解题新思路
c语言·数据结构·算法