Palindrome检测器即使不是回文也会返回true

时间:2014-08-28 02:10:38

标签: java database eclipse boolean palindrome

我需要确保在我完成的每项任务中,我必须编写自己的原始代码而不是复制其他人的代码。它似乎比你想象的更难。我正在尝试编写一个回文探测器作为任务的一部分。代码很好,除了一个问题。输出说它是真的,即使它不是回文并且它以相同的字符开始和结束。求你帮我吧。这是我的代码:

public static boolean isPalindrome_nr(String word){
    int beginning = 0;
    int end = word.length() - 1;

    boolean pd = true;

    for (int i = end; i>0; i--){
        if(word.charAt(0) == word.charAt(word.length()-1)){
            pd = true;
        }
        else if (word.charAt(0) != word.charAt(word.length()-i)){
            pd = false;
        }
    }

    return pd;
}

public static void main(String[] args) {
    // TODO Auto-generated method stub

    Scanner scan = new Scanner(System.in);
    System.out.println("Is the string a palindrome or not? ");
    String test = scan.nextLine();
    System.out.println("Answer: " + isPalindrome_nr(test));
}

目标是获得单词test,它不是回文,注册为false,abba,这是一个回文,注册为true,而应用程序,不是回文,注册为false。

2 个答案:

答案 0 :(得分:4)

您只是比较第一个和最后一个字符。这还不足以确定String是否是回文。

你需要这样的东西:

pd = true;
for (int i = end; i>=0; i--){
    if(word.charAt(i) != word.charAt(end-i)){
        pd = false;
        break;
    }
}

这可以进一步改进,因为这个循环会测试所有对两次,所以我可能已经在end / 2或(end / 2)+1结束了。

答案 1 :(得分:0)

您只检查第一个和最后一个字符。该方法应如下所示,以便您的for循环实际上执行它应该执行的操作:

public static boolean isPalindrome_nr(String word) {
    int beginning = 0;
    int end = word.length() - 1;

    boolean pd = true;

    for (int i = end; i > 0; i--) {
        // notice the use of i in here so that it will check all opposite chars
        if(word.charAt(i) == word.charAt(word.length() - 1 - i)) {
            pd = true;
        }
        else { // don't need the else-if
            pd = false;
        }
    }

    return pd;
}

正如另外一点,还有另一种测试字符串是否为回文的方法:反转它并测试反向字符串是否等于原始字符串。像这样(它是一个单行):

public static boolean isPalindrome(String s) {
    return new StringBuilder(s).reverse().toString().equals(s);
}

或更长的方式(使用for-loop而不是使用StringBuilder#reverse()方法反转字符串

public static boolean isPalindrome(String s) {
    StringBuilder reverseString = new StringBuilder();

    // reverse the string
    for (int i = s.length() - 1; i > -1; i--) {
        reverseString.append(s.charAt(i));
    }

    // return whether or not the reversed string is equal to the original string
    return reverseString.toString().equals(s);
}