如何优化我编写的以下 java 代码以生成下一个回文数


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

如果它是一个奇数长度数字,则无需反转中间数字。

与需要越来越多的时间的蛮力不同,您添加的每个数字都将花费十倍的时间。使用该方法与位数成正比。

此外,代码的大小应该约为一半。

最新更新