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

Leetcode 2273代码报错:数组索引-97越界,请求排查问题

问题分析与修复方案

核心错误原因

  1. 数组访问越界导致负数索引
    你用同一个j遍历words[i]和words[i-1],但如果两个单词长度不同(比如words[i]比words[i-1]长),当j超过words[i-1].size()时,words[i-1][j]会访问非法内存,得到的字符值随机,减97后可能变成负数,导致temp[check1]访问负数索引,触发越界错误。

  2. 变位词判断逻辑完全错误
    变位词要求字符种类和数量完全相同,与顺序无关,但你按相同位置的字符加减计数的逻辑,会把"abc"和"cba"这类合法变位词误判为非变位词,完全不符合题目要求。

  3. ans变量未循环重置
    ans只在函数开头初始化一次为true,如果某次判断出不是变位词,ans会被设为false,后续所有循环都会沿用这个错误值,导致真正的变位词也无法被删除。

修复后的代码

class Solution {
public:
    vector<string> removeAnagrams(vector<string>& words) {
        int i = 1;
        while (i < words.size()) {
            // 长度不同直接排除变位词可能
            if (words[i].size() != words[i-1].size()) {
                i++;
                continue;
            }
            
            int temp[26] = {0};
            // 统计当前单词的字符出现次数
            for (char c : words[i]) {
                temp[c - 'a']++;
            }
            // 减去前一个单词的字符出现次数
            for (char c : words[i-1]) {
                temp[c - 'a']--;
            }
            
            bool isAnagram = true;
            for (int k = 0; k < 26; k++) {
                if (temp[k] != 0) {
                    isAnagram = false;
                    break;
                }
            }
            
            if (isAnagram) {
                words.erase(words.begin() + i);
                // 删除后不递增i,下一个元素会移到当前位置
            } else {
                i++;
            }
        }
        return words;
    }
};

修复要点说明

  • 先校验长度:变位词长度必然相同,提前过滤可避免无效计算和越界风险。
  • 正确统计字符:分别遍历两个单词统计字符计数,再对比计数差是否全为0,这是判断变位词的标准逻辑。
  • 循环内重置判断变量:每次判断前重新初始化isAnagram,避免之前的结果干扰当前判断。
  • 用while循环简化逻辑:删除元素后无需手动调整索引,逻辑更直观清晰。

内容的提问来源于stack exchange,提问作者Its Me Pratham

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 04:30:59