【问题标题】:String out of Index :java.lang.ArrayIndexOutOfBoundsException. String overflows maybe字符串超出索引:java.lang.ArrayIndexOutOfBoundsException。字符串可能溢出
【发布时间】:2018-12-08 17:30:19
【问题描述】:
class Solution {
    public String longestCommonPrefix(String[] strs) {    
        String result = new String("");
        char compareElement;
        int i;//index of strs
        int j;//index of the first one of string
        for(j = 0; j < strs[0].length(); j++){
            compareElement = strs[0].charAt(j);
            for(i = 1; i < strs.length; i++){
                if(compareElement == strs[i].charAt(j)){
                    if(i == strs.length - 1)
                        result += compareElement;
                    else
                        continue;
                }
                else{
                    break;
                }
            }
        }

        return result;
    } 
}

测试样本是

Input: ["flower","flow","flight"]
Output: "fl"

嗨,我在 Leetcode 的第四个小程序中遇到了 Java 中的字符串问题。此函数的目的是在字符串数组中找到最长的公共前缀字符串。但例外

Exception in thread "main" 
java.lang.StringIndexOutOfBoundsException: String index out of 
range: 4
at java.lang.String.charAt(String.java:614)
at Solution.longestCommonPrefix(Solution.java:11)
at __DriverSolution__.__helper__(__Driver__.java:4)

再次出现。 有人知道吗?谢谢!

【问题讨论】:

  • 一个建议:将j 用于外部循环,将i 用于内部循环,这违反了正常约定,并且会导致任何阅读您的代码的人感到困惑。通常循环从外部的i 开始,然后是jk(如果你超过k,你可能做错了;-)。实际问题是您的第二个字符串的字符数少于第一个字符串,因此当您在第二个字符串中查找字符 4 时,它不存在。

标签: java string


【解决方案1】:

我认为这是你出错的地方:

if(compareElement == strs[i].charAt(j))

j 在从 0strs[0].lenght() 时会变得太大(请参阅您的外部循环)。

如果strs[i].lengt() 小于strs[0].length(),您将得到StringIndexOutOfBoundsException

【讨论】:

    【解决方案2】:

    当您遍历比较字符串时,您永远不会检查您正在比较的字符串的长度。在您的示例中,测试用例flow。索引 4 处的字符不存在,因为仅定义了索引 0-3。 if(compareElement == strs[i].charAt(j)){ 当 j 为 4 时,它会搞砸。为了修复它,你必须确保你没有超过字符串的长度。除了查找 StringBuilder 是什么之外,对于这个小的测试用例来说,它并不重要,但是随着你越来越大它会。

    【讨论】:

      【解决方案3】:

      如果数组中有一个比第一个元素短的元素,您的代码将失败。您需要检查 j 是否仍然小于您要比较的字符串的长度:

          public String longestCommonPrefix(String[] strs) {
          String result = new String("");
          char compareElement;
          int i;// index of strs
          int j;// index of the first one of string
          for (j = 0; j < strs[0].length(); j++) {
              compareElement = strs[0].charAt(j);
              for (i = 1; i < strs.length; i++) {
                  if (j < strs[i].length() && compareElement == strs[i].charAt(j)) {
                      if (i == strs.length - 1)
                          result += compareElement;
                      else
                          continue;
                  } else {
                      break;
                  }
              }
          }
      
          return result;
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-10-31
        • 2013-05-13
        • 1970-01-01
        • 2010-12-06
        • 2016-02-19
        • 2012-03-02
        相关资源
        最近更新 更多