为何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":
- 第一次循环
i=1,发现ss[1] == ss[0](都是'a'),删除这两个字符后ss变成"bb",此时设置i=0。 - 下一次循环时,
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
相关产品推荐
相关产品推荐

