[英]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;
}
您有一个良好的开端,但我认为您应该考虑一种更简单的方法。 您只需要使用一个索引(而不是i
和y
)来跟踪您在字符串中的位置,因为该问题指出重叠是可能的。 因此,在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.