for循环中的Java字符串索引超出范围(codingbat函数mirrorEnds)

for循环中的Java字符串索引超出范围(codingbat函数mirrorEnds),java,string,Java,String,我有一个关于字符串3中编码BAT的问题。问题如下: 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.

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

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;

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

例如,字符串“abXYZba”的镜像端为“ab”

镜像端(“abXYZba”)→ “ab”

镜子末端(“abca”)→ “a”

镜像端(“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;

}

但是这个问题让我犯了一个错误,说indexoutofbounds。为什么会出现这种情况?

您正在访问错误字符串的
i
th字符:

x += Character.toString(x.charAt(i));
字符串
x
一开始是空的,因此索引0处的字符不存在

改为访问原始的
字符串

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);


}
公共字符串镜像结束(字符串){
int start=0;
int end=string.length()-1;
对于(int i=0;i
publicsstringmirrorneds(stringstring){
字符串g=“”;

对于(int i=0;i您有一个好的开始,但是我认为您应该考虑一个更简单的方法。您只需要使用一个索引(既不是代码< i>代码/<代码> y>代码>)来跟踪您在字符串中的位置,因为问题表明重叠是可能的。因此,您不必运行for for循环,直到<代码>字符串。()/2
,您可以让它在字符串的整个长度上运行

此外,您应该考虑使用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;
}
公共字符串镜像结束(字符串){
字符串mirror=“”;
int i=0;
而(i
另一个需要注意的方便提示是,在Java中,可以不强制转换就将字符附加到字符串中。在for循环中的第一个if语句中,不需要使用
Character.toString()
x.charAt(i)
强制转换到字符串中,只需将
x.charAt(i)附加到字符串中即可
通过写入
x+=x.charAt(i)

公共字符串镜像(字符串str)到字符串末尾{
StringBuilder newStr=新的StringBuilder();
字符串结果=”;
对于(int i=0;i
publicsstringmirrorneds(stringstring){
//反向给定字符串
字符串反转=”;
对于(int i=string.length()-1;i>=0;i--){
反向+=字符串字符(i);
}
//同时循环遍历每个字符串。如果“string”的子字符串等于“reversed”的子字符串,
//将子字符串指定给变量“text”
字符串文本=”;
对于(int i=0;i
publicsstringmirrorneds(stringstring){
串出“”;
int len=string.length();

对于(int i=0,j=len-1;我想我是瞎子:)。我看了太多其他东西,忘了检查这个简单的调用…为您的代码提供一些上下文,来解释您是如何解决提问者的问题的,这会很有帮助。我建议您在回答中添加一些解释性文本,否则您可能会因为“低质量”而将其删除(尽管这可能是一个正确的答案)!您也可以利用stringbuilder类,因为它具有反向方法。我的解决方案将字符串的开头与反向结尾匹配。欢迎使用此方法!请描述您正在做的事情-请阅读^^此问题已包含多个答案和一个可接受的答案。您能解释您的答案与t的不同之处吗其他答案?也要知道,从长远来看,纯代码答案是没有用的。这是类似的。区别在于,这里我先反转了字符串,然后再继续处理其余的解决方案;还使用了本机的“StartWith”方法,而不是直接比较字符,我发现这更容易阅读。谢谢你的评论。我会l在将来回复时添加更多解释。为什么使用两个for循环?请对您的答案进行一些解释,以便其他人可以学习。虽然此代码可能提供问题的解决方案,但最好添加上下文说明其工作原理。这可以帮助将来的用户学习,并将这些知识应用到他们自己的代码中。您也可以在解释代码时,用户可能会以投票的形式给予积极反馈。
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;
}
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; 
}