回文识别器

时间:2017-03-04 18:21:00

标签: java char palindrome

我正在学习Java。我正在构建这个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.");
        }
    }
}

5 个答案:

答案 0 :(得分:4)

一旦你确定输入不是回文,你应该结束测试。

目前,您的算法可以改变主意!

你也在过早地增加我。

答案 1 :(得分:2)

问题在于,您必须在输入数组的第一个元素之前启动,因为您在循环开始时执行int i = -1;

while (j > i && !isPalindrome);

此外,循环的退出条件可以改进,因此它会先退出:

logingRTCCharacteristic.setvalue(timestamp)

答案 2 :(得分:1)

您是否可以使用StringBuilder?如果是这样,您可以执行String reverseText = new StringBuilder(userInput).reverse().toString();

如果没有,为什么不尝试迭代一次数组然后在最后进行比较?保留arrayreverseArray初始值设定项,但之后执行for或while循环,只需忠实地从userInput变量复制到两个数组中的正确位置。

然后你可以在最后使用一个比较来决定要打印的内容。

答案 3 :(得分:1)

一些事情。

  • 您应该在循环结束时进行索引更改,以修复从1开始的较低索引。
  • 根据之前的更改,您应该从userInput.length()-1开始上层索引,因为这将是您检查的顶部的第一个索引。
  • 你应该在找到一个不匹配时停止,否则使用一个奇数长度的字符串,你的结果总是检查中间字符对自己(否则你的结果将最终检查两个中间字符偶数串相互对抗)。

如果你想要完整的重新设计解决方案,我可以发布它,但你可以从这里自己解决它!

答案 4 :(得分:0)

嗯,问题是每次检查两个字母时都要设置isPalindrome。因此,当最后两个字母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。

我没有测试过此代码,因此可能会出现其他一些错误。但这是我乍一看的那个。

编辑:我没有从字符串的开头开始。最好使用一段时间而不是一会儿,因为字符串可能是空的。