繁体   English   中英

Java 字符串索引在 for 循环中越界(codingbat 函数 mirrorEnds)

[英]Java string index out of bounds in for loop (codingbat function mirrorEnds)

我有一个关于字符串 3 中codingbat 问题的问题。问题如下:

给定一个字符串,在给定字符串的开头和结尾寻找一个镜像(向后)字符串。 换句话说,零个或多个字符位于给定字符串的最开头,并以相反的顺序(可能重叠)在字符串的末尾。

例如,字符串“abXYZba”的镜像结尾是“ab”

mirrorEnds("abXYZba") → "ab"

mirrorEnds("abca") → "a"

mirrorEnds("aba") → "aba"

我的代码如下:

public String mirrorEnds(String string) {

if(string.length() <=1) return string;  
String x = "";
int y = string.length() - 1;


for(int i = 0; i < string.length()/2; i++)
{ 
  if(string.charAt(i) == string.charAt(y))
  {
    x+= Character.toString(x.charAt(i)); 
    y--;
  }
  else
  {
    return x;
  }
  
}

return string;

}

当我尝试以下操作时:

“xxyxx”

字符串长度为 5,因此索引为 0-4。 如果我在我的代码上运行它,逻辑将是:

    i = 0 and y = 4;

string.charAt(i) == string.charAt(y) //true and i++ and y--
string.charAt(i) == string.charAt(y) //true and i++ and y--
//i is == string.length()/2 at this point

但是这个问题给我一个错误,说 indexoutofbounds。 为什么会这样?

您正在此处访问错误字符串的第i个字符:

x += Character.toString(x.charAt(i));

字符串x是空的,所以索引 0 处的字符不存在。

改为访问原始string

x += Character.toString(string.charAt(i));

这是我解决这个问题的代码,简单的一个

public String mirrorEnds(String string) {

  int start = 0;
  int end = string.length()-1;

  for(int i=0;i<string.length();i++){

    if(string.charAt(start) == string.charAt(end) ){
      start++;
      end--;
    }

    if(start != ((string.length()-1)-end)){
      break;
    }


  }

  return string.substring(0,start);


}
  public String mirrorEnds(String string) {

     String g="";

  for(int i=0;i<string.length();i++){
 if(string.charAt(i)==string.charAt(string.length()-1-i)){

  g=g+string.charAt(i);
      } else{

  break;
  }
 }
   return g;
  }

您有一个良好的开端,但我认为您应该考虑一种更简单的方法。 您只需要使用一个索引(而不是iy )来跟踪您在字符串中的位置,因为该问题指出重叠是可能的。 因此,在string.length() / 2之前您不需要运行 for 循环,您可以让它运行整个字符串长度。

此外,您应该考虑使用 while 循环,因为您在问题中有明确的退出条件:一旦开头的字符串不再等于结尾的字符串,则中断循环并返回字符串的长度。 while 循环还会使用较少的变量,并会减少代码中条件运算符的数量。

这是我对这个问题的回答。

public String mirrorEnds(String string) {
    String mirror = "";
    int i = 0;
    while (i < string.length() && string.charAt(i) == string.charAt(string.length() - i - 1) {
        mirror += string.charAt(i);
        i++;
    }
    return mirror;
}

另一个需要注意的方便提示是,可以在 Java 中将字符附加到字符串中而无需强制转换。 在 for 循环中的第一个 if 语句中,您不需要使用Character.toString()x.charAt(i)转换为字符串,您可以简单地将x.charAt(i)附加到字符串的末尾写作x += x.charAt(i)

public String mirrorEnds(String str) {
  StringBuilder newStr = new StringBuilder();
  String result = "";
  
  for (int i=0; i <= str.length(); i++){
    newStr.append(str.substring(0, i));
    if (str.startsWith(newStr.toString()) && str.endsWith(newStr.reverse().toString()))
      result = str.substring(0, i);
    
    newStr.setLength(0);
  }
  return result;
}
public String mirrorEnds(String string) {

    // reverse given string
    String reversed = "";
    for (int i = string.length() - 1; i >= 0; i--) {
        reversed += string.charAt(i);
    }
    // loop through each string simultaneously. if substring of 'string' is equal to that of 'reversed', 
    // assign the substring to variable 'text' 
    String text = "";
    for (int i = 0; i <= string.length(); i++) {
        if (string.startsWith(string.substring(0, i)) ==
                string.startsWith(reversed.substring(0, i))) {
            text = string.substring(0, i);
        }
    }
    
    return text;

}
public String mirrorEnds(String string) {
  String out = "";
  int len = string.length();
  for(int i=0,j = len-1;i<len;i++,j--)
  {
    if(string.charAt(i) == string.charAt(j))
      out += string.charAt(i);
    else
      break;
  } 
  return out; 
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM