求和回文

时间:2019-07-15 18:02:33

标签: python-3.x

这是问题陈述: 对于给定的编号num,执行:
1.添加numreverse(num)
2。检查sum是否为回文。否则重复。
这是我的解决方案。该程序似乎适用于给定的3个测试用例,但是当我执行此程序时,对于1个专用测试用例,我遇到服务器超时错误。我的程序效率不高吗?

flag=0
iteration=0
num = 195 # sample no. output produced is 9339 which is a palindrome.
while(flag!=1):
    #print("iteration ",iteration)
    num_rev= int(str(num)[::-1]) #finding rev of number
    #print(num_rev)
    total= num+num_rev #adding no and no_rev
    #print(total)
    total_rev= int((str(total))[::-1]) # finding total rev
    iteration=iteration+1
    if total==total_rev: #if equal, printing palindrome
        print("palindrome")
        flag=1
    else:
        num=total #else the new no becomes sum of old num and old_rev

1 个答案:

答案 0 :(得分:0)

首先,为每个测试用例分析代码,以找出花费这么长时间的代码。我建议使用 Jupyter Notebook 的代码分析魔术。将您的代码粘贴到Jupyter Notebook单元格中,并用%%prun作为单元格。连同其他信息一起,它将返回函数调用列表,每个函数被调用的次数以及每个函数运行所花费的时间。将测试用例的运行时间与服务器的超时限制进行比较。

如果问题不在于您的代码,而是问题的复杂性随着数量的增加而增加,那么这可能是服务器问题。

...

请注意,回文中必须包含至少2或3个元素,具体取决于您接受的定义。

请考虑您的一个测试用例可能正在冒险进入任意大的整数,而这些整数花费了不可预测的时间进行计算。请考虑该计算时间可能超过服务器的超时限制。

此外,考虑此代码的修改版本,该版本接受每个种子编号任意定义的最大迭代深度。它还接受任意种子数和最大种子数。然后返回所有非重复种子编号,它们各自的回文总数,找到回文所需的迭代次数以及执行搜索所需的大概时间的有序列表:

#flag = 0
iteration = 0
maxiter   = 1000
num       = 0
max_num   = 10000

used_seeds = []
palindromes = []

while num < max_num:
    seed = num

    while(iteration <= maxiter) and len(str(total))>2:
        if num in used_seeds: 
            break

        iteration+=1

        num_reversed   = int(str(num)[::-1])
        total          = num + num_reversed
        total_reversed = int((str(total))[::-1])

        if total == total_reversed:
            used_seeds.append(num)
            palindromes.append( [num, total] )
            break
        else:
            num = total

    num = seed+1
    iteration = 0

palindromes.sort(key=lambda elem: elem[0])
print(palindromes)

顺便说一句,结果令人着迷。希望这会有所帮助。