【Python3】【力扣题】202. 快乐数

【力扣题】题目描述:

【Python3】【力扣题】202. 快乐数_第1张图片

【Python3】【力扣题】202. 快乐数_第2张图片

【Python3】代码:

1、解题思路:用哈希集合检测循环。设置集合记录每次结果,判断结果是否为1。若计算结果已在集合中则进入循环,结果一定不为1。

(1-1)知识点:集合:元素不重复的序列,大括号“{}”,元素之间逗号“,”隔开。

                           str(...):转为字符串。为了遍历每一个数字。

                           int(...):转为整数。为了进行数学运算。

                           sum(...):求和。

                           集合.add(...):往集合中添加元素。

class Solution:
    def isHappy(self, n: int) -> bool:
        res = {n}        # 将最初的n加入集合
        while n != 1:
            n = sum(int(x)**2 for x in str(n))  # 每一位数字的平方再求和
            if n in res: return False
            else: res.add(n)
        return True

(1-2)知识点:set( ):创建空集合。

                           map(函数,序列):序列映射。序列中每一个元素调用函数执行操作,返回新序列。

注解:此处的 return n==1 相当于 if n==1:return True; else: return False

class Solution:
    def isHappy(self, n: int) -> bool:
        res = set()         # 创建空集合
        while n != 1 and n not in res:
            res.add(n)
            n = sum(map(lambda x:int(x)**2,str(n)))  # 每一位数字的平方再求和
        return n == 1

(1-3)知识点:n % 10:十进制的数字获取最低位。

                           n // 10:十进制的数字去除最低位,相当于右移。

class Solution:
    def isHappy(self, n: int) -> bool:
        # 计算每一位的数字的平方再求和,返回计算结果
        def get_next(n):
            total = 0
            while n > 0:
                total += (n % 10) ** 2
                n //= 10
            return total
        # 判断是否为1
        res = set()
        while n != 1:
            res.add(n)
            n = get_next(n)
            if n in res: return False
        return True

2、解题思路:快慢指针。慢指针计算一次,快指针计算两次,判断是否为1。若快指针和慢指针相同且不为1,则进入循环,结果一定不为1。

注解:slow,fast = n,get_next(n) 相当于 slow=n;fast=get_next(n)。

class Solution:
    def isHappy(self, n: int) -> bool:
        # 计算每一位的数字的平方再求和,返回计算结果
        def get_next(n):
            total = 0
            while n > 0:
                total += (n % 10) ** 2
                n //= 10
            return total

        slow,fast = n,get_next(n)
        while slow != fast:
            slow = get_next(slow)
            fast = get_next(get_next(fast))
        return fast == 1

3、解题思路:数学。大量求解得出的数学规律,结果不为1的循环为4→16→37→58→89→145→42→20→4。因此只要计算结果在这个循环中,一定不为1。

class Solution:
    def isHappy(self, n: int) -> bool:
        cycle_num = {4,16,37,58,89,145,42,20}   # 集合
        while n not in cycle_num:
            n = sum(map(lambda x:int(x)**2,str(n)))   # 每一位数字的平方再求和
            if n == 1: return True
        return False
        

 

你可能感兴趣的:(力扣题,leetcode,python)