如何生成我的代码以检查该单词是否是回文?

时间:2014-07-07 10:48:56

标签: java

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)

我该怎么做才能解决错误并使我的代码正常工作?我希望程序检查单词是否是回文。

3 个答案:

答案 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!!!");
    }
}
  • 检查单词的左半部分和右半部分应该只有一次,所以我们在'if'条件下写'let.length / 2'而不是'let.length'
  • 例外根本原因是你试图获得'let.length - i'字符:在第一次迭代中你得到 let.length - 0 = let.length ,所以我们应该用'let.length - i - 1'
  • 替换它
  • 'if'条件被反转以获得正确的检查逻辑

答案 2 :(得分:3)

首先,你的异常发生在这一行

if (let[i] == let[let.length - i]) {

因为i == 0然后let.length - 0 == let.length,并且该索引不存在。指数始终从0let.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:在荷兰语中,有一些漂亮的单词是回文:

  • Meetsysteem(测量系统)
  • Parterretrap(地下楼梯)

随意使用它们来测试上述方法。