如何找到Nth回文?

时间:2014-12-03 18:12:48

标签: java algorithm numbers palindrome time-limiting

亲爱的朋友们:

  • 和字符串一样,某些数字也是回文。例如:1,2,3,4,5,6,7,8,9,11,22,33,......,101,111,......,753537,......等等。

  • 这就是事情,我们需要找到一种方法来找到第一个10.000个回文数字以响应用户的输入。从1到10000的回文数开始。 例如,如果用户输入12,则表示1到10.000之间的第12个回文数是多少?

  • 输入由一系列行组成,每行包含一个整数值i(1 <= i <= 10000)。该整数值i表示要写入输出的回文数的索引,其中索引1代表第一回文数(1),索引2代表第二回文数(2),依此类推。

EX:

输入1 - &gt;输出应为:1

输入12 - &gt;输出应为:33

输入24 - &gt;输出应为:151

    import java.util.Scanner;

    public class xth_palindrome
    {
        // Some Code may be here

        public static void main(String[] args)
        {
            @SuppressWarnings("resource")
            Scanner read = new Scanner(System.in);
            System.out.println("Enter values as much as you want. To stop Enter \"0\" ");

            int Xth;

            do
            {
                Xth = read.nextInt();

                // Some coding here 

                System.out.println(Xth + " palindromic num is " + "????");

            } while(Xth != 0);
        }
    }
  • 顺便说一句:时间限制 1秒。 考虑这些因素解决此问题的正确算法是什么?如果您可以帮助我并在Java中显示解决方案代码,我将非常感激。谢谢你查一下!

2 个答案:

答案 0 :(得分:0)

我们可以很快地遍历回文。注意

  1. 如果有一个奇怪的回文ABCBA,下一个较大的回文将是ABDBA,其中D = C + 1

  2. 如果有一个偶数回文ABCCBA,下一个较大的回文将是ABDDBA,其中D = C + 1

  3. 推理很简单。任何其他数字也会增加更大的MSB,因此下一个更高的回文将在中心发生变化。

    现在如果C = 9,我们将需要增加B并将C重置为0,使得案例变为AE0EA和AE00EA,其中E = B + 1。这种方法很容易扩展,你可以迭代回文。由于我们需要找到最多10,000个,因此对于迭代方法来说,第二个应该足够了。

答案 1 :(得分:0)

也许不是&#34;最好的方式&#34;,但工作正常。

它可以在不到1秒的时间内完成工作(取决于您的硬件)。

我已经测试了here

import java.util.Scanner;

public class HelloWorld{

     public static void main(String []args){

            Scanner read = new Scanner(System.in);
            System.out.println("Enter values as much as you want (lower than 100000).\n To stop Enter \"0\" ");

            int Xth;

            do
            {
                Xth = read.nextInt();


                // Some coding here 
                if (Xth > 100000)
                {
                    System.out.println("Type a number lower than 100000");
                    continue;
                }
                int count = 0;
                for (int i = 1; i <= 1000000000; i++)
                {
                    if (!isPalindrome(i))
                        continue;

                    count++;
                    if (count == Xth)
                    {
                        System.out.println(Xth + "th palindromic number is " + i);
                        break;
                    }
                }
                if (count != Xth)
                    System.out.println("I can't compute that!");


            } while(Xth != 0);
     }

     private static StringBuilder sb = new StringBuilder();

     private static boolean isPalindrome(int i)
     {
        sb.setLength(0);
        sb.append(i);
        return  sb.toString().equals(sb.reverse().toString());
     }