You need to enable JavaScript to run this app. 基于for循环实现游程长度编码时输出结果异常的问题
优惠活动
大模型
产品
解决方案
定价
更多

基于for循环实现游程长度编码时输出结果异常的问题

游程编码实现逻辑错误修正

核心问题定位

原代码存在4处逻辑硬伤,直接导致输出完全错位:

  • 计数多算1次:内层循环从in = r起步,第一次判断时是同一字符自比较,搭配初始值为1的count,会把连续字符数多算1。例如开头2个连续的a,会被计数为3。
  • 输出内容错位:遇到不同字符触发分支时,r被直接修改为下一段的起点,此时输出的str[r]是下一段的字符,而非当前统计段的字符——统计a段的逻辑里,实际输出的是后续f段的字符,导致原段的统计结果完全丢失。
  • 末尾段无输出:字符串最后一段字符遍历到末尾时,不会触发“遇到不同字符”的分支,最后一段的计数永远不会被打印,count变量会停在最后一段的计数值。
  • 循环变量自增冲突:内层分支手动修改了r的值后,外层for循环每次仍会自动执行r++,导致下一段的起点偏移1位,漏算字符。

修正后代码

保留双层循环的实现结构,修正上述逻辑问题:

#include <iostream>
#include <string>
using namespace std;
int main()
{
    string str = "aafffkhjskk";
    cout << str << endl;
    int count;
    // 外层循环去掉自动r++,手动控制分段跳转
    for (int r = 0; r < str.length(); ) {
        count = 1;
        int in;
        // 内层从r的下一个位置开始遍历,避免自比较
        for (in = r + 1; in < str.length(); in++) {
            if (str[in] == str[r]) {
                count++;
            } else {
                break;
            }
        }
        // 内层遍历结束后立刻输出当前段的统计值
        cout << count << " ****** " << str[r] << endl;
        // 直接跳转到下一段的起始位置
        r = in;
    }
    return 0;
}

修正后运行输出与预期一致:

aafffkhjskk
2 ****** a
3 ****** f
1 ****** k
1 ****** h
1 ****** j
1 ****** s
2 ****** k

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.11.07 04:06:04