我正在尝试解决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();
}
}
答案 0 :(得分:1)
由于您想要找到大于K的最小回文,请考虑以下规则和逻辑:
我首先得到每个数字的频率并从那里开始。
希望这有帮助。