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