小鱼的数字游戏: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容器文档
相关推荐
房开民5 小时前
OpenCV C++ 中,访问图像像素三种常用方法
c++·opencv·计算机视觉
报错小能手5 小时前
C++笔记(面向对象)深赋值 浅赋值
c++·笔记·学习
dragoooon346 小时前
[优选算法专题四.前缀和——NO.31~32 连续数组、矩阵区域和]
数据结构·算法·leetcode·1024程序员节
py有趣6 小时前
LeetCode算法学习之移除元素
java·数据结构·算法
Maple_land6 小时前
编译器的“隐形约定”与本地变量:解锁Linux变量体系的关键密码
linux·运维·服务器·c++·centos
OC溥哥9996 小时前
C++2D地铁跑酷代码
开发语言·c++
一念&6 小时前
每日一个C语言知识:C 预处理器
c语言·算法
油泼辣子多加7 小时前
【实战】自然语言处理--长文本分类(2)BERTSplitLSTM算法
算法·自然语言处理·分类
WWZZ20257 小时前
快速上手大模型:深度学习2(实践:深度学习基础、线性回归)
人工智能·深度学习·算法·计算机视觉·机器人·大模型·slam
紫荆鱼7 小时前
设计模式-状态模式(State)
c++·后端·设计模式·状态模式