代码随想录算法训练营第五天(3)|202.快乐数

49 阅读2分钟
  • Leetcode 题目
  • 文章讲解
  • 视频讲解

题目描述

编写一个算法来判断一个数 n 是不是快乐数。

「快乐数」定义为:对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和,然后重复这个过程直到这个数变为 1,也可能是 无限循环 但始终变不到 1。如果 可以变为  1,那么这个数就是快乐数。

如果 n 是快乐数就返回 True ;不是,则返回 False 。

代码示例

class Solution:
    def isHappy(self, n: int) -> bool:
        # 使用集合记录出现过的数字,以便检测循环
        record = set()

        while True:
            # 获取新的数字
            new_num = self.getSum(n)
            print(new_num)

            # 如果新数字为1,说明是快乐数
            if new_num == 1:
                return True

            # 如果新数字在集合中已经存在,说明进入了循环
            if new_num not in record:
                record.add(new_num)
            else:
                return False

            # 更新n,继续下一轮循环
            n = new_num

    def getSum(self, n: int) -> int:
        # 计算各位数字平方和
        sum_result = 0
        while n:
            sum_result += (n % 10) ** 2
            n //= 10
        return sum_result

自己看到题目的第一想法是按照题意将每个位置上的数字进行平方和操作,直到 sum = 1 出现。然而,面临的问题是如何处理可能出现的无限循环。看完代码随想录后,我明白了一个巧妙的解决办法:通过哈希表记录每次计算得到的 sum 值,当遇到重复的 sum 就退出循环,返回 False。

在实现过程中,我遇到了一些困难,尤其是在处理循环中的求余数操作。通过学习和思考,我逐渐理解了循环的控制逻辑,并成功实现了解题的算法。

这次经历让我更加熟悉了哈希表的应用,同时也加深了对循环结构的理解。通过不断解决问题的过程,我对算法和编程的能力得到了一定的提升。