回文识别器
Palindrome Recognizer
我正在学习 Java。我正在构建这个回文识别器并使用两个带有字符的数组,我认为我已经用我发现的其他东西得到了一个很好的实现,但我正在打破我的头脑来理解为什么它到目前为止没有按预期工作。发生了什么:
- "A Santa at Nasa",回文,检查为回文。
- "I don't know, anything",不是回文,检查不是回文。
- "Not a palindrome",不是回文,检查为回文。
我基本上需要一些帮助来了解我的代码到底哪里出错了。谢谢!
/*
"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++
:
int i = -1;
此外,您的循环的退出条件可以改进,因此它会更早退出:
while (j > i && !isPalindrome);
好吧,问题是你每次检查两个字母时都设置了 isPalindrome。所以当最后2个字母checkt相同时,它会说这是一个回文。试试这个:
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.");
}
}
所以现在 isPalindrome 布尔值一开始就设置为 true,当我们发现与此矛盾的东西(两个不相同的字符)时,它会将 isPalindrome 设置为 false。
我没有测试过这段代码,所以可能还有其他错误。不过第一眼看到的就是这个
编辑:我没有从字符串的开头开始。最好使用 while 而不是 do while,因为字符串可能为空。
您可以使用 StringBuilder
吗?如果是这样,你可以做 String reverseText = new StringBuilder(userInput).reverse().toString();
如果不是,为什么不尝试遍历数组一次,然后在最后进行比较?保持 array
和 reverseArray
初始值设定项不变,然后执行 for 或 while 循环,然后忠实地从 userInput
变量复制到两个数组中的正确位置。
那么你可以在最后使用一个单一的比较来决定打印什么。
几件事。
- 您应该在循环结束时更改索引,以修复从
1
开始的较低索引。
- 根据之前的更改,您应该从
userInput.length()-1
开始您的上索引,因为这将是您检查的从顶部开始的第一个索引。
- 当你发现一个不匹配时你应该停止,否则对于奇数长度的字符串,你的结果将始终是中间字符与自身的检查(否则你的结果最终将是两个字符的检查偶数字符串的中间字符相互竞争)。
如果您想要完整的重新设计的解决方案,我可以 post,但您可能可以从此处自行修复!
我正在学习 Java。我正在构建这个回文识别器并使用两个带有字符的数组,我认为我已经用我发现的其他东西得到了一个很好的实现,但我正在打破我的头脑来理解为什么它到目前为止没有按预期工作。发生了什么:
- "A Santa at Nasa",回文,检查为回文。
- "I don't know, anything",不是回文,检查不是回文。
- "Not a palindrome",不是回文,检查为回文。
我基本上需要一些帮助来了解我的代码到底哪里出错了。谢谢!
/*
"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++
:
int i = -1;
此外,您的循环的退出条件可以改进,因此它会更早退出:
while (j > i && !isPalindrome);
好吧,问题是你每次检查两个字母时都设置了 isPalindrome。所以当最后2个字母checkt相同时,它会说这是一个回文。试试这个:
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.");
}
}
所以现在 isPalindrome 布尔值一开始就设置为 true,当我们发现与此矛盾的东西(两个不相同的字符)时,它会将 isPalindrome 设置为 false。
我没有测试过这段代码,所以可能还有其他错误。不过第一眼看到的就是这个
编辑:我没有从字符串的开头开始。最好使用 while 而不是 do while,因为字符串可能为空。
您可以使用 StringBuilder
吗?如果是这样,你可以做 String reverseText = new StringBuilder(userInput).reverse().toString();
如果不是,为什么不尝试遍历数组一次,然后在最后进行比较?保持 array
和 reverseArray
初始值设定项不变,然后执行 for 或 while 循环,然后忠实地从 userInput
变量复制到两个数组中的正确位置。
那么你可以在最后使用一个单一的比较来决定打印什么。
几件事。
- 您应该在循环结束时更改索引,以修复从
1
开始的较低索引。 - 根据之前的更改,您应该从
userInput.length()-1
开始您的上索引,因为这将是您检查的从顶部开始的第一个索引。 - 当你发现一个不匹配时你应该停止,否则对于奇数长度的字符串,你的结果将始终是中间字符与自身的检查(否则你的结果最终将是两个字符的检查偶数字符串的中间字符相互竞争)。
如果您想要完整的重新设计的解决方案,我可以 post,但您可能可以从此处自行修复!