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

为何super_reduced_string代码中设置i=0无报错?求解析

解析super_reduced_string函数中的i=0设置与charAt(i-1)无报错问题

先看问题里的示例和代码:

Sample Input 0
aaabccddd
Sample Output 0
abd

对应的解决方案代码:

static String super_reduced_string(String s) { 
    int i; 
    String s1="Empty String"; 
    StringBuffer ss = new StringBuffer(s); 
    for(i = 1; i < ss.length(); i++) { 
        if(ss.charAt(i) == ss.charAt(i-1)) { 
            ss.deleteCharAt(i); 
            ss.deleteCharAt(i-1); 
            i = 0; 
        } 
    } 
    String str2 = ss.toString(); 
    if(ss.length() == 0) return s1; 
    else return str2; 
}

下面分两个部分解答你的困惑:

一、删除字符后设置i = 0的原因

这段代码的核心是反复删除字符串中相邻的重复字符对,直到没有相邻重复为止。当我们删除i和i-1位置的两个重复字符后,前面的字符可能会和新的当前位置字符形成新的相邻重复对,如果不从头检查,就会漏掉这些情况。

举个具体例子:假设输入是aabb,初始ss为"aabb":

  1. 第一次循环i=1,发现ss[1] == ss[0](都是'a'),删除这两个字符后ss变成"bb",此时设置i=0。
  2. 下一次循环时,for循环的i++会把i变成1,此时ss.length()为2,满足i < ss.length(),进入循环后发现ss[1] == ss[0](都是'b'),删除后ss为空,最终返回"Empty String"。

如果不设置i=0,删除第一个aa后i会变成2,此时ss.length()为2,循环条件i < ss.length()不成立,循环直接结束,就会漏掉后面的bb,得到错误结果"bb"。所以设置i=0是为了让循环从头开始检查,确保所有可能的相邻重复对都被处理到。

二、为什么ss.charAt(i-1)不会触发索引越界错误?

仔细分析循环的执行流程,你会发现循环体里的i永远不会是0:

  • 循环的初始值是i=1,且只有当i < ss.length()时才会进入循环体。这意味着进入循环体时,i的最小值是1,i-1就是0,而此时ss.length()至少是2(因为i=1 < ss.length()),所以索引0是完全合法的,不会越界。
  • 当执行删除操作后设置i=0,下一次循环时,for循环会先执行i++,把i变成1,再判断循环条件,所以进入循环体时i还是1,i-1=0依然合法。

简单来说,循环体里的i始终≥1,i-1始终≥0,自然不会触发StringIndexOutOfBoundsException。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 06:45:05