寻找下一个最大的回文数

时间:2016-11-10 07:21:25

标签: python palindrome

我试图为SPOJ上的下一个最大的回文解决this问题,但它给我一个超出时间限制的错误。这是我在python中解决问题的方法,

t = int(raw_input().strip())

for i in range(t):
    a = raw_input()
    a = str(int(a) + 1)
    palin = ""

    if (len(a) % 2 == 0):

        reverseoffirst = []
        mainStr = a

        firsthalf = mainStr[0:len(a) / 2]
        secondhalf = firsthalf[::-1]

        palin = "".join(firsthalf) + "".join(secondhalf)

        if (int(palin) < int(a)):
            firsthalf = str(int(firsthalf) + 1)
            secondhalf = firsthalf[::-1]
            palin = "".join(firsthalf) + "".join(secondhalf)


    else:
        median = len(a) / 2
        mainStr = a

        if(median == 0):
            palin = "11"

        else:
            firsthalf = mainStr[0:median]
            secondhalf = firsthalf[::-1]

            palin = "".join(firsthalf) + mainStr[median] + "".join(secondhalf)

            if (int(palin) < int(a)):
                lastvalue = int(mainStr[median]) + 1

                if (lastvalue == 10):
                    firsthalf = str(int(firsthalf) + 1)
                    secondhalf = firsthalf[::-1]
                    palin = firsthalf + "0" + secondhalf

                else:
                    palin = firsthalf + str(lastvalue) + secondhalf
    print palin

我知道我的问题可能会因为复制这样的几个问题而被忽视,但我的方法并没有从任何地方复制。这就是为什么我想知道我的代码有什么问题。

如果您能指出任何更好的代码或任何不满足的测试用例或任何其他对我有用的方法,请指出。谢谢!!

2 个答案:

答案 0 :(得分:0)

我拿了你的代码,并稍微改了一下,所以你的逻辑是一样的。

尝试调试它,以便了解它的工作方式。

注意它只适用于数字而非字母。

基本上,根据你的逻辑,我检查了上半场和下半场的联合是下一个回文

祝你好运

a = str(int(input())) # the initial number to check
is_palin = False
while True:
    a = str(int(a) + 1)
    if is_palin:
        print palin
        break
    palin = ""

    if (len(a) % 2 == 0):

        reverseoffirst = []
        mainStr = a

        firsthalf = mainStr[0:len(a) / 2]
        secondhalf = firsthalf[::-1]

        palin = "".join(firsthalf) + "".join(secondhalf)

        if (int(palin) == int(a)):
            is_palin = True
            print palin


    else:
        median = (len(a) / 2)
        mainStr = a
        firsthalf = mainStr[0:median]
        secondhalf = firsthalf[::-1]
        palin = "".join(firsthalf) + mainStr[median] + "".join(secondhalf)
        if (int(palin) == int(a)):
            is_palin = True
            print palin

Output

答案 1 :(得分:0)

也许不是最有效的方法:

def IsPalindrome(n):
       s = str(n)
       l = len(s)
       return s[:l/2] == s[:(l+1)/2-1:-1]

def NextPalindrome(n):
       while not IsPalindrome(n):
              n += 1
       return n

NextPalindrome(65973)会立即返回66066