为什么这段代码不起作用(Python中的Leetcode)?

时间:2015-05-14 21:22:48

标签: python

class Solution:
    def isHappy(self, n):
        list_n, l, ls, num = [n,], 0, 0, 0
        while num != 1:
            if l != ls:
                return False
            num = sum([int(i)**2 for i in list(str(n))])
            list_n.append(num)
            l, ls = len(list_n), len(set(list_n))
        return True

输入:7

输出:False

预期:True

来自Happy Number | LeetCode OJ

编写算法以确定数字是否“满意”。

幸福数字是由以下过程定义的数字:从任何正整数开始,将数字替换为其数字的平方和,并重复该过程,直到数字等于1(它将保留的位置),或者它在一个不包括1的循环中无休止地循环。这个过程以1结尾的那些数字是幸福的数字。

3 个答案:

答案 0 :(得分:1)

回答这个问题:您的代码失败了,因为您混淆了numn。特别是,您始终从num计算n,并且都不会更改。只是摆脱其中一个,这也将不那么混乱。你真的应该学会调试,顺便说一下......在循环中打印numn会清楚地说明发生了什么。

使用套装会更容易,更快,也可以试试。这是一种方式:

def isHappy(n):
    stop = {1}
    while n not in stop:
        stop.add(n)
        n = sum(int(d)**2 for d in str(n))
    return n == 1

这里只使用两个单一的整数。你能看出它是如何运作的吗?

def isHappy(n):
    s = lambda n: sum(int(d)**2 for d in str(n))
    m = s(n)
    while m != n:
        n, m = s(n), s(s(m))
    return n == 1

答案 1 :(得分:1)

原因如下:

每次求和运算后,必须将

n重置为最新结果。所以只需在return True之前添加此行:

n=num

供您参考,以下是工作代码:

def isHappy(n):
list_n, l, ls, num = [n,], 0, 0, 0
while num != 1:
    if l != ls:
        return False
    num = sum([int(i)**2 for i in list(str(n))])
    list_n.append(num)
    l, ls = len(list_n), len(set(list_n))
    n=num # reset n after each sum calculation
return True

答案 2 :(得分:0)

您可以在sm时保持循环,sm是当前n或最后sm == 1的数字的平方和。返回def isHappy( n): # set initial sum of squares sm = sum(int(i) * int(i) for i in str(n)) seen = set() # while we have not hit 1 or we get a repeated `sm` while sm != 1 and sm not in seen: # add sm to our set seen.add(sm) # update sm sm = sum(int(i) * int(i) for i in str(sm)) # we will get here either when sm is 1 or we had a repeated sm return sm == 1 以测试数字是否满意:

In [2]: for x in range(100+1):
   ...:     if isHappy(x):
   ...:           print(x)
   ...:         
1
7
10
13
19
23
28
31
32
44
49
68
70
79
82
86
91
94
97
100

输出:

{{1}}

根据你问题中的wiki页面描述如果n不满意,那么它的序列不会转到1.相反,它会在循环中结束所以如果我们看到重复的值,我们知道号码不开心。我在代码中没有看到你正在检查那个条件。