我试图为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
我知道我的问题可能会因为复制这样的几个问题而被忽视,但我的方法并没有从任何地方复制。这就是为什么我想知道我的代码有什么问题。
如果您能指出任何更好的代码或任何不满足的测试用例或任何其他对我有用的方法,请指出。谢谢!!
答案 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
答案 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
。