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结尾的那些数字是幸福的数字。
答案 0 :(得分:1)
回答这个问题:您的代码失败了,因为您混淆了num
和n
。特别是,您始终从num
计算n
,并且都不会更改。只是摆脱其中一个,这也将不那么混乱。你真的应该学会调试,顺便说一下......在循环中打印num
或n
会清楚地说明发生了什么。
使用套装会更容易,更快,也可以试试。这是一种方式:
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.相反,它会在循环中结束所以如果我们看到重复的值,我们知道号码不开心。我在代码中没有看到你正在检查那个条件。