Palindrome循环始终打印为True

时间:2015-11-15 16:32:29

标签: java palindrome

我是新手,也是Java新手。 我有一个任务是编写一个循环来检查具有给定结构的回文。 我只允许使用for循环和if语句。 这是我的代码。结果始终显示为true。

package palindrom;

/**
*
* @author Edwin
*/
public class Palindromcheck {
    static boolean is_palindrom(String str) {

         int n = str.length();
         for (int i = 0; i <= (n / 2) + 1; ++i) {
             if (str.charAt(i) != str.charAt(n - i - 1)) {
                 return false;
             }
         }
         return true;
     }

     public static void main (String [] args){
         assert(is_palindrom(""));
         assert(is_palindrom("a"));
         assert(is_palindrom("aa"));
         assert(is_palindrom("aba"));
         assert(!is_palindrom("abab"));
         assert(!is_palindrom("abb"));

         if (true)
             System.out.println("Everything good!");
     }
}

3 个答案:

答案 0 :(得分:3)

除了关于断言的观点,还有

for (int i = 0; i <= (n / 2) + 1; ++i)

不太对劲。如果n01,则(n / 2) + 11,因此这两种情况都会产生StringIndexOutOfBoundsException。正确的条件是:

for (int i = 0; i < (n + 1) / 2; ++i) 

答案 1 :(得分:2)

据我所知,您的代码完美无缺。所有断言都不应该触发,因为你在所有不是回文的字符串之前放了一个!

&#34; if(true)&#34;最后一个println的位置有点奇怪。它没有做任何事情,因为真实总是如此。

答案 2 :(得分:2)

我想指出,即使您删除了assert s,您在代码中提供的!语句也可能无法满足您对当前JVM设置的期望。正如Daniel T所建议的那样(你真的应该删除它们)。

例如,如果使用标准JVM设置编译并执行以下命令:

class Example {
    public static boolean yieldFalse() {
        return false;
    }
    public static void main(String[] args) {
        assert(yieldFalse());
        System.out.println("No error!");
    }
}

你会发现“没有错误!”每次都打印到标准输出。这是因为默认情况下JVM未启用断言。

如果你看一下this answer,你会发现如何启用它们。但是,您可能更方便地编写以下代码,以便运行代码的任何人都可以获得您想要的输出:

if (!is_palindrom("string")) {
    // throw an exception or print to the console
    // "string" is not a palindrome
}