Java 递归回文;索引越界
我试图编写一个函数来检查字符串变量是否是回文。 我找不到此代码引发Java 递归回文;索引越界,java,recursion,palindrome,Java,Recursion,Palindrome,我试图编写一个函数来检查字符串变量是否是回文。 我找不到此代码引发IndexOutOfBoundException的原因。我尝试使用示例来跟踪结果,但我仍然看不出异常来自何处 public static boolean palindrome(String s) { if (s.charAt(0) == s.charAt(s.length() - 1)) { if (s.length() > 2) { StdOut.print(s
IndexOutOfBoundException
的原因。我尝试使用示例来跟踪结果,但我仍然看不出异常来自何处
public static boolean palindrome(String s) {
if (s.charAt(0) == s.charAt(s.length() - 1)) {
if (s.length() > 2) {
StdOut.print(s.substring(1, s.length() - 2));
palindrome(s.substring(1, s.length() - 2));
} else
return true;
}
return false;
}
回文
可能会以一个空字符串结束对自身的调用。发生这种情况时,在s.charAt(0)
中,带有的第一行给出一个IndexOutOfBoundsException
另外,仔细检查,
子字符串
调用中的边界也不正确:因为结束索引是独占的,第二个参数应该是S.length()-1
。你也需要解决这个问题。回文
最终可能会用一个空字符串调用自己。发生这种情况时,在s.charAt(0)
中,带有的第一行给出一个IndexOutOfBoundsException
另外,仔细检查,
子字符串
调用中的边界也不正确:因为结束索引是独占的,第二个参数应该是S.length()-1
。您也需要修复它。您的子字符串错误。您正在从末尾删除一个额外的字符
public static boolean palindrome(String s) {
if (s.charAt(0) == s.charAt(s.length() - 1)) {
if (s.length() > 2) {
StdOut.print(s.substring(1, s.length() - 1));
palindrome(s.substring(1, s.length() - 1));
} else
return true;
}
return false;
}
你的子字符串是错误的。您正在从末尾删除一个额外的字符
public static boolean palindrome(String s) {
if (s.charAt(0) == s.charAt(s.length() - 1)) {
if (s.length() > 2) {
StdOut.print(s.substring(1, s.length() - 1));
palindrome(s.substring(1, s.length() - 1));
} else
return true;
}
return false;
}
这里有几个问题:
substring
调用是错误的,endIndex
是独占的,因此应该以s.length()-1)
palindrome
,然后继续使用函数,最终返回false
——相反,您应该返回应用于子字符串的palindrome
的结果:public static boolean palindrome(String s) {
if (s.charAt(0) == s.charAt(s.length() - 1)) {
if (s.length() > 2) {
// note the return and the corrected substring
return palindrome(s.substring(1, s.length() - 1));
} else
return true;
}
return false;
}
这里有几个问题:
substring
调用是错误的,endIndex
是独占的,因此应该以s.length()-1)
palindrome
,然后继续使用函数,最终返回false
——相反,您应该返回应用于子字符串的palindrome
的结果:public static boolean palindrome(String s) {
if (s.charAt(0) == s.charAt(s.length() - 1)) {
if (s.length() > 2) {
// note the return and the corrected substring
return palindrome(s.substring(1, s.length() - 1));
} else
return true;
}
return false;
}
试试这个:
public static boolean palindrome(String s)
{
if (s.length() < 2)
return true;
if (s.charAt(0) != s.charAt(s.length()-1))
return false;
return palindrome(s.substring(1,s.length()-1));
}
公共静态布尔回文(字符串s)
{
如果(s.长度()<2)
返回true;
如果(s.charAt(0)!=s.charAt(s.length()-1))
返回false;
返回回文(s.substring(1,s.length()-1));
}
试试这个:
public static boolean palindrome(String s)
{
if (s.length() < 2)
return true;
if (s.charAt(0) != s.charAt(s.length()-1))
return false;
return palindrome(s.substring(1,s.length()-1));
}
公共静态布尔回文(字符串s)
{
如果(s.长度()<2)
返回true;
如果(s.charAt(0)!=s.charAt(s.length()-1))
返回false;
返回回文(s.substring(1,s.length()-1));
}
查看异常的堆栈跟踪。它确切地告诉您它发生在哪一行,以及无效的索引值是什么。我没有提到的另一个问题是,您忽略了递归调用的结果-我相信您希望返回此结果。请查看异常的堆栈跟踪。它确切地告诉您它发生在哪一行,以及无效的索引值是什么。我没有提到的另一个问题是,您忽略了递归调用的结果-我相信您希望返回它。实际上,字符串应该至少是1个图表。非常感谢您。我没有理解你所说的第一部分,是的,最后一个调用将是s.charAt(0),但是条件:s.charAt(0)=s.charAt(s.length()-1)可以检查:实际上字符串应该至少是1个chart非常感谢你。我没有理解你所说的第一部分,是的,最后一个调用将是s.charAt(0),但是条件:s.charAt(0)=s.charAt(s.length()-1)可以检查:charAt(0)
应该是s.charAt(0)
@bcsb1001:yes,必须在粘贴问题的过程中滑出。谢谢:)谢谢,它帮助我理解了条件的顺序。charAt(0)
应该是s.charAt(0)
@bcsb1001:Yep,一定是在复制粘贴过程中从问题中漏掉的。谢谢:)谢谢,它帮助我了解了条件的顺序。