我是新手,也是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!");
}
}
答案 0 :(得分:3)
除了关于断言的观点,还有
行for (int i = 0; i <= (n / 2) + 1; ++i)
不太对劲。如果n
为0
或1
,则(n / 2) + 1
为1
,因此这两种情况都会产生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
}