我正在尝试解决SPOJ问题5:找到给定输入的下一个最大整数“回文”;也就是说,十进制表示法的整数从左到右和从右到左读取相同。
请查看问题here
我没有使用暴力搜索,而是尝试计算下一个回文。但是我的代码仍然返回 TLE (即超出时间限制),我很沮丧......你介意给我一个提示吗?
这是我在python 3.x中的代码
if __name__ == '__main__':
n = int(input())
for i in range(n):
string = input()
length = len(string)
ans = ""
if length %2 == 0 :
half = length // 2
str_half = string[0:half]
ans = str_half + str_half[::-1]
if(ans <= string):
str_half = str(int(str_half) + 1)
ans = str_half + (str_half[0:half])[::-1]
print(ans)
else:
half = length // 2
str_half = string[0:half]
ans = str_half + string[half] + str_half[::-1]
if(ans<= string):
str_half = str(int(str_half+string[half]) + 1)
ans = str_half + (str_half[0:half])[::-1]
print(ans)
答案 0 :(得分:7)
输入可能很长。问题陈述说&#34;不超过1000000个数字&#34;。所以可能有几个测试用例有几十万个数字。将这样的琴弦分成两半,倒转一半并附加它们确实需要一点时间。但据我所知,Python的字符串处理非常好,因此对此问题的贡献很小。
花费 long 时间的是将这样长度的字符串转换为数字,将大数字转换为字符串。对于K = 10 ** 200000 + 2
,步骤str_half = str(int(str_half+string[half]) + 1)
仅需要一秒钟。它可能在您的计算机上更快,但SPOJ的机器速度很慢,这种情况可能会让您超过时间限制。
所以你必须避免转换,直接在字符串表示(可变数字列表)上工作。
答案 1 :(得分:3)
因此,基于该问题,我们可以找出K.length == 1的情况下最长的回文数。这种情况可以安全地忽略,因为没有大于K的值,即K的回文。这同样适用于K.length == 2。因此,评估它的伪代码如下所示:
if K.length <= 2
pass
当K.length == 3时,我们关心的值是K [0]和K [2],这给了我们边界。例如,K == 100。我们关心的值是1和0。如果K [0] 大于而不是K [2]我们知道我们必须使K [2] = K [0]并且我们完成了。另一个例子是K == 200,第一个较大的值是202,这是第一个相等的素数。如果K [0] == K [2]且K <1。 999,我们将K [1]增加1,我们完成了。伪码如下:
if K[0] > K[2]
K[2] = K[0]
if K[0] == K[2] and K < 999
K[1]++
如果K中的所有值均为9(999,9999等),则将K递增2并结束该过程。 除非你最终陷入困境,否则我会将算法的一般形式留给你。