我在任务SPOJ上遇到了一些问题。我总是得到"时间限制超过"。请帮我提高代码的效率。我是初学者。
任务: 如果正整数在从左到右和从右到左读取时在十进制系统中的表示相同,则称为回文。对于给定的正整数K不超过1000000位,写入大于K的最小回文值输出。始终显示数字而不带前导零。
输入
第一行包含整数t,即测试用例的数量。整数K在下一行中给出。
输出
对于每个K,输出大于K的最小回文。
实施例
输入: 2 808 2133
输出: 818 2222
警告:输入/输出数据较大,请注意某些语言
我的解决方案:
import java.util.*;
import java.lang.*;
import java.math.BigInteger;
import java.io.*;
class Main
{
public static void main (String[] args) throws java.lang.Exception
{
Scanner sc=new Scanner(System.in);
int n=sc.nextInt();
for(int i=0; i<n; ++i){
System.out.println(findpalindrome(sc.next()));
}
}
private static String findpalindrome(String n){
if(n.length()==1){
if(n.charAt(0)-'0'<9)return ""+(n.charAt(0)-'0'+1);
else return "11";
}
String result="";
if(firstpartlarger(n)){
if(n.length()%2==0)result=n.substring(0, n.length()/2)+reverse(n.substring(0, n.length()/2));
else result=n.substring(0, n.length()/2)+n.charAt(n.length()/2)+reverse(n.substring(0, n.length()/2));
}
else{
if(n.length()%2==0){
result=increase(n.substring(0, n.length()/2));
result+=reverse(result.substring(0, result.length()-1));
}
else{
result=increase(n.substring(0, n.length()/2+1));
result+=reverse(result.substring(0, n.length()/2));
}
}
return result;
}
private static String increase(String n){
BigInteger i=new BigInteger(n);
i=i.add(BigInteger.ONE);
return i.toString();
}
private static String reverse(String n){
StringBuilder builder=new StringBuilder(n);
builder.reverse();
return builder+"";
}
private static boolean firstpartlarger(String n){
return reverse(n.substring(0, n.length()/2)).compareTo(n.substring(n.length()-n.length()/2))>0;
}
}