这是问题陈述:
对于给定的编号num
,执行:
1.添加num
和reverse(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
答案 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)
顺便说一句,结果令人着迷。希望这会有所帮助。