【发布时间】:2017-06-03 07:28:52
【问题描述】:
我在 codewars 网站上参加了一个 python 挑战。我遇到了以下挑战:
42 的除数是:1、2、3、6、7、14、21、42。这些除数的平方是:1、4、9、36、49、196、441、1764。平方和除数是 2500 即 50 * 50,一个正方形!
给定两个整数 m, n (1
结果将是一个数组数组,每个子数组有两个元素,第一个是平方除数为平方的数字,然后是平方除数之和。
输出应该是:
list_squared(1, 250) --> [[1, 1], [42, 2500], [246, 84100]]
list_squared(42, 250) --> [[42, 2500], [246, 84100]]
list_squared(250, 500) --> [[287, 84100]]
我编写了以下代码,其中包含两个附加功能:一个对应于确定一个数字的所有因数,另一个对应于检查一个数字是否是完全平方。
确定所有因素的功能:
def fact(m):
return [i for i in range(1,m+1) if m%i == 0]
函数检查一个数是否是完全平方,如果不是则返回0,否则返回平方根
def square_root(x):
ans = 0
while ans < x // 2 + 1:
ans = ans + 1
if ans*ans == x:
return ans
break;
return 0
计算所需结果的函数
def list_squared(m, n):
# your code
fac=[]
for i in range(m,n+1):
sq_sum = sum(list(map(lambda x: x**2,fact(i))))
if square_root(sq_sum) != 0:
fac.append([i,sq_sum])
return fac
这段代码给了我正确的结果,但是它太长了。我能够通过所有测试结果,但我花了大约 6000 毫秒。当我尝试提交代码时,网页提交返回算法效率低下,耗时超过 1200 毫秒,这是最大值。
如果有人能为此指出更好的算法,我将不胜感激。
【问题讨论】:
-
两个挑剔:在
return ans之后不需要break,因为这将结束函数。ans = ans+1也可以缩短为ans+=1。 -
also
sum(list(map(lambda x: x**2,fact(i))))=>sum(map(lambda x: x**2,fact(i)))无需转换为列表即可传递给 sum -
ans +=1 比 ans = ans + 1 慢吗?按照@numbermaniac 的建议,我将后者更改为前者。现在我的示例测试运行时间变得慢了很多。
-
我不认为它会更慢。您是否也根据 Jean 的建议更改了
sum?如果有,不知道是不是这个原因。