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

LeetCode 443字符串压缩代码出现Heap-Buffer-Overflow运行时错误求助

LeetCode 443 字符串压缩 Heap-Buffer-Overflow 问题修复

问题根源

  1. 违反题目规则,冗余写入数字:LeetCode 443要求仅当字符出现次数>1时才追加数字,你的代码对出现次数为1的字符也写入数字,导致pointer无意义累加,后续写入字符时超出数组边界,触发Heap-Buffer-Overflow。
  2. 未处理最后一组字符:遍历结束后,最后一组连续字符及其次数未写入结果数组,既导致压缩不完整,也可能引发后续越界风险。
  3. 边界检查无效:你添加的(pointer + j) < charsSize仅能阻止数字写入越界,但无法避免pointer过度累加后写入字符的越界操作。

修复后的代码

int compress(char* chars, int charsSize) {
    if (charsSize < 2)
        return charsSize;

    int pointer = 0;
    char curr = chars[0];
    int currNum = 1;

    for (int i = 1; i < charsSize; i++) {
        if (chars[i] == curr) {
            currNum++;
        } else {
            chars[pointer++] = curr;
            // 仅次数>1时写入数字
            if (currNum > 1) {
                int tempNum = currNum;
                int start = pointer;
                // 从低位到高位写入数字
                while (tempNum > 0) {
                    chars[pointer++] = (tempNum % 10) + '0';
                    tempNum /= 10;
                }
                // 反转数字得到正确顺序
                int end = pointer - 1;
                while (start < end) {
                    char temp = chars[start];
                    chars[start] = chars[end];
                    chars[end] = temp;
                    start++;
                    end--;
                }
            }
            curr = chars[i];
            currNum = 1;
        }
    }

    // 处理循环结束后的最后一组字符
    chars[pointer++] = curr;
    if (currNum > 1) {
        int tempNum = currNum;
        int start = pointer;
        while (tempNum > 0) {
            chars[pointer++] = (tempNum % 10) + '0';
            tempNum /= 10;
        }
        int end = pointer - 1;
        while (start < end) {
            char temp = chars[start];
            chars[start] = chars[end];
            chars[end] = temp;
            start++;
            end--;
        }
    }

    return pointer;
}

关键修复点

  • 添加次数判断:仅在currNum > 1时写入数字,避免pointer不必要的累加,从根源上防止越界。
  • 补充最后一组处理:遍历结束后单独处理最后一组字符,确保所有数据都被压缩。
  • 优化数字写入逻辑:通过低位写入+反转的方式生成数字字符串,避免原代码中复杂的索引计算,降低出错概率。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 04:12:02