为什么';这段代码行得通吗(Python中的Leetcode)?
输入:7 输出:为什么';这段代码行得通吗(Python中的Leetcode)?,python,Python,输入:7 输出:False 应为:True 它来自快乐数字| LeetCode OJ 写一个算法来判断一个数字是否“快乐” 快乐数是由以下过程定义的数字:从任何正整数开始,用其数字的平方和替换该数字,然后重复该过程,直到该数字等于1(它将保持不变),或者在不包括1的循环中无限循环。此过程以1结尾的数字是愉快的数字。当sm是当前n个数字的平方和时,或直到重复sm时,您可以保持循环。返回sm==1以测试数字是否满意: class Solution: def isHappy(self, n):
False
应为:True
它来自快乐数字| LeetCode OJ
写一个算法来判断一个数字是否“快乐”
快乐数是由以下过程定义的数字:从任何正整数开始,用其数字的平方和替换该数字,然后重复该过程,直到该数字等于1(它将保持不变),或者在不包括1的循环中无限循环。此过程以1结尾的数字是愉快的数字。当
sm
是当前n个数字的平方和时,或直到重复sm
时,您可以保持循环。返回sm==1
以测试数字是否满意:
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
输出:
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
根据您问题中的wiki页面描述,如果n不满意,则其顺序不会变为1。相反,它在循环中结束,所以如果我们看到重复的值,我们知道这个数字是不快乐的。我看不到您的代码中有任何地方在检查该条件。回答这个问题:您的代码失败是因为您混淆了
num
和n
。特别是,您总是从n
计算num
,并且两者都不会改变。只要去掉其中一个,也就不会那么令人困惑了。你真的应该学会调试,顺便说一句。。。在循环中打印num
或n
可以清楚地知道发生了什么
顺便说一句,使用电视机会更容易、更快,也可以试试。这里有一个方法:
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
这里有一个只使用两个单整数的。你能看到它是如何工作的吗
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
原因如下: 每次求和运算后,必须将n重置为最新结果。因此,只需在返回True之前添加这一行即可:
n=num
以下是工作代码,供您参考:
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
为什么它是一门课?另外,
sum(int(i)**2表示列表中的i(str(n))
会更好,您正在毫无理由地构建一个列表,list\u n
有重复的值,它将返回False
它是作为一个类构建的,因为我从OJ复制了它。感谢您对我的列表理解的建议。我知道我的列表可能会复制以查看这样的序列。然而,对于快乐数字,列表是否会在包含多个数字之前被复制?一旦num等于1,它就会退出while循环。我看不出这个问题的答案在哪里。问题是给定的代码有什么问题。“这个问题并不要求解决快乐数字问题。”我现在回答了这个问题。现在可以了吗?谢谢你~你的解决方案也很有启发性。天哪,我喜欢lambda解决方案!我是一名编程新手,非常感谢您的帮助!
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