Java 回文识别器
我在学Java。我正在构建这个回文识别器,并使用两个带字符的数组,我认为我已经找到了一个很好的实现方法,但我很想弄明白为什么到目前为止它没有按预期工作。正在发生的事情: 美国宇航局的圣诞老人,回文,检查为回文。 我不知道,任何东西,不是回文,检查为不是回文。 非回文,非回文,检查为回文。 我基本上需要一些帮助来理解我的代码到底哪里出错了。谢谢Java 回文识别器,java,char,palindrome,Java,Char,Palindrome,我在学Java。我正在构建这个回文识别器,并使用两个带字符的数组,我认为我已经找到了一个很好的实现方法,但我很想弄明白为什么到目前为止它没有按预期工作。正在发生的事情: 美国宇航局的圣诞老人,回文,检查为回文。 我不知道,任何东西,不是回文,检查为不是回文。 非回文,非回文,检查为回文。 我基本上需要一些帮助来理解我的代码到底哪里出错了。谢谢 /* "A Santa at Nasa" is an example of palindrome. */ import java.util.Sc
/*
"A Santa at Nasa" is an example of palindrome.
*/
import java.util.Scanner;
public class Palindrome
{
public static void main (String[] args)
{
boolean isPalindrome = false;
Scanner kb = new Scanner(System.in);
System.out.println("Enter a string:");
String userInput = kb.nextLine();
userInput = userInput.trim().replaceAll(" ", "").toLowerCase();
char[] array = new char[userInput.length()];
char[] reverseArray = new char[userInput.length()];
int i = 0;
int j = userInput.length();
do {
i++;
j--;
array[i] = userInput.charAt(i);
reverseArray[j] = userInput.charAt(j);
if (array[i] != reverseArray[j])
{
isPalindrome = false;
}
else
{
isPalindrome = true;
}
} while (j > i);
if(isPalindrome)
{
System.out.println("It's a palindrome.");
}
else
{
System.out.println("Not a palindrome.");
}
}
}
一旦确定输入不是回文,就应该结束测试 现在你的算法可以改变主意了
你还过早地增加了i 问题是,您必须在输入数组的第一个元素之前开始,因为您在循环的开头执行i++操作:
int i = -1;
此外,可以改善循环的退出条件,使其提前退出:
while (j > i && !isPalindrome);
问题是,每次检查两个字母时,都会设置isAlindrome。所以,当最后两个字母CHECK T相同时,它会说这是一个回文。相反,请尝试以下方法:
import java.util.Scanner;
public class Main
{
public static void main (String[] args)
{
boolean isPalindrome = true;
Scanner kb = new Scanner(System.in);
System.out.println("Enter a string:");
String userInput = kb.nextLine();
userInput = userInput.trim().replaceAll(" ", "").toLowerCase();
char[] array = new char[userInput.length()];
char[] reverseArray = new char[userInput.length()];
int i = 0;
int j = userInput.length() - 1;
while(i < j && isPalindrome) {
array[i] = userInput.charAt(i);
reverseArray[j] = userInput.charAt(j);
if (array[i] != reverseArray[j])
isPalindrome = false;
i++;
j--;
}
if(isPalindrome)
System.out.println("It's a palindrome.");
else
System.out.println("Not a palindrome.");
}
}
现在,isAlindrome布尔值在开始时设置为true,当我们发现与这两个字符不相同的内容相矛盾时,它会将isAlindrome设置为false
我还没有测试这段代码,所以可能还有其他错误。但这是我第一眼看到的
编辑:我不是从字符串的开头开始的。最好使用while而不是do-while,因为字符串可能是空的。是否允许使用StringBuilder?如果是这样,您可以执行String reverseText=new StringBuilderuserInput.reverse.toString
如果不是,为什么不尝试遍历数组一次,然后在最后进行比较呢?保持数组和reverseArray初始值设定项不变,然后执行for或while循环,然后忠实地将userInput变量复制到两个数组中的正确位置
然后,您可以在最后使用一个比较来决定打印什么。一些事情
您应该在循环结束时更改索引,以修复从1开始的较低索引。
在前面的更改中,您应该从userInput.length-1开始上一个索引,因为这将是您检查的第一个索引。
当您发现一个不匹配时,您应该停止,否则对于奇数长度的字符串,您的结果将始终是中间字符对其自身的检查,否则您的结果将最终是偶数字符串的两个中间字符对彼此的检查。
如果您想要完整的重新工作的解决方案,我可以发布它,但您可能可以从这里自己修复它 这听起来是一个熟悉调试器使用的好机会。在调试过程中,当您逐行查看代码并观察其行为和值时,逻辑在什么程度上偏离了预期?我认为错误来自I++in do循环。你在得到字符值之前先增加。我认为@Bathsheba是主要问题,但你也可能想在循环结束时增加你的计数器-你没有检查第一个字符,但你会在循环退出之前检查第一对j>I失败的字符。可能是Hi@David的重复,我怎么能这样做?目前我只使用Atom和一个终端,没有什么比IDE更新奇的了。op也把I,j的工作搞砸了:可能是偶然的。我,@Bathsheba?你的意思是从0开始而不是从-1开始吗?我弄错了,如果是这样,人们已经提出了解决办法。谢谢如果还有其他事情,请告诉我。不,你的解释已经非常有用了,我可以从这里开始工作,学习是我的目标。非常感谢我是,我也试过,但老实说,我有一大堆问题困扰着我/虽然你的代码看起来很简单,但我会尝试两者。非常感谢没问题!让我知道结果如何。我通过在-1处启动第一个数组,并在while循环上添加一个新的逻辑条件,以在它为false时立即退出循环,从而使它正常工作。稍后我将真正尝试StringBuilder,因为它似乎也是一个非常有用的学习类。非常感谢。我只是在j>I&&isPalindrome;相反,谢谢!