import java.math.BigInteger;
import java.util.ArrayList;
import java.util.Scanner;
import javax.swing.event.AncestorEvent;
public class NextPalindrome {
public static void main(String args[])
{
Scanner console = new Scanner(System.in);
ArrayList<BigInteger> inArr = new ArrayList<BigInteger>();
int tc = console.nextInt();
for(int x =0 ;x<tc;x++){
BigInteger num = console.nextBigInteger();
num = num.add(BigInteger.valueOf(1));
inArr.add(num);
}
for(int y =0 ;y<tc;y++)
{
while(!checkPal(inArr.get(y))){
BigInteger temp = inArr.get(y);
temp = inArr.get(y).add(BigInteger.valueOf(1));
inArr.set(y, temp);
}
System.out.println(inArr.get(y));
}
}
static boolean checkPal(BigInteger num){
String str = num.toString();
char[] charStr = str.toCharArray();
//System.out.println(charStr);
boolean isPal= true;
int first =0;
int last = str.length()-1;
for(int i = 0; i<str.length();i++){
if(charStr[first] == charStr[last])
{
first++;
last--;
continue;
}else
{
isPal = false;
break;
}
}
return isPal;
}
}
我编写的这段代码适用于中小型输入,但是如果我像任何随机更大的数字一样给出更大的数字,则表示已超出时间限制。任何人都可以就此提供意见。
palidrome是指后半部分是前半部分的反映。
您需要做的就是取数字的前半部分,递增并反转前半部分的数字。 例如,说你有。
326856897845875634
以上半场为例
326856897
递增它(在检查为此数字生成回文不大之后)
326856898
并且由于它是一个偶数长度数字,因此颠倒了前半部分。
326856898898658623
如果它是一个奇数长度数字,则无需反转中间数字。
与需要越来越多的时间的蛮力不同,您添加的每个数字都将花费十倍的时间。使用该方法与位数成正比。
此外,代码的大小应该约为一半。