这个问题在这里已经有答案了:
寻找数字串下一个回文的更好算法(10个答案)
5年前关门了。
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;
}
}
我写的这段代码对于小到中等大小的输入工作得很好,但是如果我给出一个更大的数字,比如任意一个随机的更大的数字,它表示超过了时间限制。有人能给出与此相关的输入吗。
1条答案
按热度按时间m0rkklqb1#
回廊是指后半部分是前半部分的反映。
你所需要做的就是把数字的前半部分取出来,递增,然后把前半部分的数字倒过来。e、 说你有。
上半场开始
递增(在检查是否为该数字生成回文后)
因为它是一个偶数长度的数字,所以倒转上半部分。
如果是奇数长度的数字,则不需要反转中间的数字。
而不是暴力,这将需要越来越多的时间,每一个数字你添加将需要10倍长。使用的方法与位数成正比。
而且代码应该是大小的一半左右。