时间限制超过了下一个回文中的错误

时间:2015-07-30 17:47:52

标签: java time

我正在尝试解决SPOJ中的下一个回文问题。我在下面的Java代码中遇到超出时间限制的错误。

“正整数称为回文,如果从左到右和从右到左读取它在十进制系统中的表示是相同的。对于给定的正整数K不超过1000000位,写入的值为最小的回文大于K输出。数字总是显示没有前导零。“

import java.math.BigInteger;
import java.util.Scanner;

public class Nextpalindrome {
    public static void main(String[] args) {
        // TODO Auto-generated method stub

        Scanner in =new Scanner(System.in);
        int t=in.nextInt();

        for (int i=1;i<=t;i++)
        {
            BigInteger bi = in.nextBigInteger();    
            String str=bi.toString();
            String str1=new String();
            String str2=new String();
            String str3=new String();
            String str4=new String();
            int l=str.length();
            int comp=0;
            if (l==2)
            {
                str1=str.substring(0,1);
                str2=str.substring(1,2);

                if (Integer.parseInt(str1)>Integer.parseInt(str2))
                str1=str1.concat(str1); 
                else if (Integer.parseInt(str2)>Integer.parseInt(str1))
                {
                str2=str2.concat(str2);             
                str1=str2;
                }
                else if (Integer.parseInt(str1)==Integer.parseInt(str2))
                {
                    int x=Integer.parseInt(str1)+1;
                    str1=Integer.toString(x);
                    str1=str1.concat(str1); 
                    }
            }

            if (l%2>0)
            {
                str1=str.substring(0,l/2);
                str2=str.substring((l/2)+1,l);
                str3 =str.substring(l/2,(l/2)+1);
                str4=new StringBuffer(str1).reverse().toString();
                BigInteger bi1 = new BigInteger(str1);
                BigInteger bi2 = new BigInteger(str2);

                comp= bi1.compareTo(bi2);

                int mid=Integer.parseInt(str3);
                if (comp==-1)
                {
                mid+=1;
                String str5=Integer.toString(mid);
                str1=str1.concat(str5);
                str1=str1.concat(str4);
                }
                else if (comp==1)
                {
                String str5=Integer.toString(mid);
                str1=str1.concat(str5);
                str1=str1.concat(str4);
                }
                else if (comp==0)
                {
                    mid+=1;
                String str5=Integer.toString(mid);
                str1=str1.concat(str5);
                str1=str1.concat(str4);
                }
            }
            if ((l>2)&&(l%2==0))
            {
                str1=str.substring(0,l/2);
                str2=str.substring(l/2,l);

                BigInteger bi1 = new BigInteger(str1);
                BigInteger bi2 = new BigInteger(str2);
                BigInteger bi3=new BigInteger("1");
                comp= bi1.compareTo(bi2);
                if (comp==-1)
                {
                bi1=bi1.add(bi3);
                str1=bi1.toString();
                str4=new StringBuffer(str1).reverse().toString();
                str1=str1.concat(str4);
                }
                else if ((comp==1)||(comp==0))
                {
               str4=new StringBuffer(str1).reverse().toString();
                str1=str1.concat(str4);
                }
            }



        System.out.println(str1);

        }

        in.close();     

    }

}

1 个答案:

答案 0 :(得分:1)

由于您想要找到大于K的最小回文,请考虑以下规则和逻辑:

  • 为了使最小的回文大于K,您必须使用所有数字。 (即1122 =&gt; 1221就是答案)。
  • 奇数长度数字只能包含频率为1的 ONE 数字,此数字将是中心数字,其他数字必须具有偶数频率(即11121 =&gt; 11211将是答案)。否则,你无法创建回文。
  • 如果长度为偶数,则所有数字必须具有偶数频率(例如,见第一项)。否则,你无法创建回文。

我首先得到每个数字的频率并从那里开始。

希望这有帮助。