SPOJ下一个回文

时间:2012-01-12 02:11:02

标签: python algorithm

我正在尝试解决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)

2 个答案:

答案 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并结束该过程。 除非你最终陷入困境,否则我会将算法的一般形式留给你。