You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

竞赛题字符串分组列读取问题:代码仅输出第一组的修复需求

问题修复请求

给定字符串(如HLOEL-)与数字P(如3),需将字符串按每组P个字符分组,按列读取各组字符(先取每组第1个,再第2个…),最终输出HELLO-。现有C++代码意图通过创建分组变量、嵌套循环实现按列读取,但仅输出第一组内容,要求仅修复现有代码逻辑,不重新实现整体方案。

现有代码

#include <iostream>
#include <iomanip>
#include <cmath>
#include <string>

using namespace std;

int main() {
    int P, i, z;
    string S, L;

    cin >> P >> S;

    for (i = 1; i <= P; i++) {
        string ix = S.substr(0, P);
        S.erase(0, P);
       
        for (z = P; z >= 1; z--) {
            i = P - z + 1;
            cout << ix.at(P - z);
        }
    }
}

输入与输出情况

  • 输入示例:
3
HLOEL-
  • 预期输出:HELLO-
  • 实际输出:HLO

代码问题分析与修复

核心问题

  1. 外层循环变量i被内层循环修改,导致外层循环提前终止。内层循环中i = P - z + 1会重置i的值,第一次外层循环结束后i变回1,无法继续处理后续分组。
  2. 逻辑完全倒置:当前代码是逐个分组输出所有字符,没有实现“按列遍历所有分组对应位置”的需求。

修复后代码(仅修改原有逻辑,未重构整体结构)

#include <iostream>
#include <iomanip>
#include <cmath>
#include <string>

using namespace std;

int main() {
    int P, col, group_idx;
    string groups[100]; // 预设分组存储数组,可根据实际需求调整大小
    int group_count = 0;

    cin >> P >> S;

    // 先把所有分组提取并存储,避免原字符串修改后丢失数据
    while (!S.empty()) {
        groups[group_count] = S.substr(0, P);
        S.erase(0, P);
        group_count++;
    }

    // 按列读取:外层循环控制列位置,内层循环遍历所有分组
    for (col = 0; col < P; col++) {
        for (group_idx = 0; group_idx < group_count; group_idx++) {
            // 避免分组长度不足P时越界
            if (col < groups[group_idx].size()) {
                cout << groups[group_idx].at(col);
            }
        }
    }
}

修复说明

  • 先提取所有分组并存储,保证后续可以重复访问每个分组的字符。
  • 外层循环控制要读取的列位置(从第0位到第P-1位),内层循环遍历所有分组,输出每个分组对应列的字符,实现按列读取的核心需求。
  • 增加字符存在性判断,处理输入字符串长度不是P整数倍的边界情况。

内容的提问来源于stack exchange,提问作者tR00I

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 13:10:00