class Pali {
public static void main(String args[]){
String word = "reliefpfpfeiller";
char[] let = word.toCharArray();
for (int i=0; i < let.length; i++ ){
if (let[i] == let[let.length -i]){
System.out.println("this is palindrome!!!");
}
}
}
}
这不起作用并出现此错误:
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 16
at Pali.main(Pali.java:6)
我该怎么做才能解决错误并使我的代码正常工作?我希望程序检查单词是否是回文。
答案 0 :(得分:6)
如果您喜欢较小的代码,可以使用StringBuilder
:
String word = "reliefpfpfeiller";
StringBuilder buffer = new StringBuilder(word);
buffer.reverse(); // reverse the letters
if(word.equals(buffer.toString())){
System.out.println("this is palindrome!!!");
}
答案 1 :(得分:3)
class Pali {
public static void main(String args[]){
String word = "reliefpfpfeiller";
char[] let = word.toCharArray();
for (int i=0; i < let.length / 2; i++ ) {
if (let[i] != let[let.length - i - 1]){
System.out.println("this is not palindrome!!!");
return;
}
}
System.out.println("this is a palindrome!!!");
}
}
答案 2 :(得分:3)
首先,你的异常发生在这一行
if (let[i] == let[let.length - i]) {
因为i == 0
然后let.length - 0 == let.length
,并且该索引不存在。指数始终从0
到let.length - 1
存在。所以为了解决这个问题,请写下
if (let[i] == let[let.length - i]) {
其次,你不必遍历整个单词的所有字符。你只需要迭代上半部分(如果字符数是奇数,那么你也需要包含中间字符)。结果为(word.length() / 2) + 1
,因为当word.length()
为奇数时,除以2的结果为floored,因此为了包含中间字符,您需要添加1. / p>
下面的代码占用了字符的前半部分,并将它们与后半部分进行比较。所以在0比较3和1比较2。
0 1 2 3
n o o n
在这个例子中,0将比较4和1比3. 2将与2比较,当然,这总是正确的。
0 1 2 3 4
a l u l a
(注意:alula是一只鸟的翅膀。)
这是诀窍的代码。
public static boolean isPalindrome(String word) {
if (word.length() == 0) {
throw new IllegalArgumentException("Word must be non-empty.");
}
for (int i = 0; i < (word.length() / 2) + 1; i++) {
if (word.charAt(i) != word.charAt(word.length() - i - 1)) {
return false;
}
}
return true;
}
PS:在荷兰语中,有一些漂亮的单词是回文:
随意使用它们来测试上述方法。