Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/283.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么';这段代码行得通吗(Python中的Leetcode)?_Python - Fatal编程技术网

为什么';这段代码行得通吗(Python中的Leetcode)?

为什么';这段代码行得通吗(Python中的Leetcode)?,python,Python,输入:7 输出:False 应为:True 它来自快乐数字| LeetCode OJ 写一个算法来判断一个数字是否“快乐” 快乐数是由以下过程定义的数字:从任何正整数开始,用其数字的平方和替换该数字,然后重复该过程,直到该数字等于1(它将保持不变),或者在不包括1的循环中无限循环。此过程以1结尾的数字是愉快的数字。当sm是当前n个数字的平方和时,或直到重复sm时,您可以保持循环。返回sm==1以测试数字是否满意: class Solution: def isHappy(self, n):

输入:7

输出:
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