LeetCode 0202-快乐数 数很快乐 我不快乐

LeetCode 0202-快乐数 数很快乐 我不快乐

说明

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

「快乐数」定义为:

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

如果 n 是快乐数就返回 true; 不是, 则返回 false

示例

输入: 19
输出: true
解释:

1 2 + 9 2 = 82 8 2 + 2 2 = 68 6 2 + 8 2 = 100 1 2 + 0 2 + 0 2 = 1 1^2 + 9^2 = 82\\ 8^2 + 2^2 = 68\\ 6^2 + 8^2 = 100\\ 1^2 + 0^2 + 0^2 = 1 12+92=8282+22=6862+82=10012+02+02=1

输入: n = 2
输出: false
解释:

2 2 = 4 4 2 = 16 1 2 + 6 2 = 37 3 2 + 7 2 = 58 5 2 + 8 2 = 89 8 2 + 9 2 = 145 1 2 + 4 2 + 5 2 = 42 4 2 + 2 2 = 20 2 2 + 0 2 = 4 2^2 = 4\\ 4^2 = 16\\ 1^2 + 6^2=37\\ 3^2+7^2=58\\ 5^2+8^2=89\\ 8^2+9^2=145\\ 1^2+4^2+5^2=42\\ 4^2+2^2=20\\ 2^2+0^2=4 22=442=1612+62=3732+72=5852+82=8982+92=14512+42+52=4242+22=2022+02=4

解1

思路

  1. 定义一个函数: 求一个数的每个位置上的数字的平方和
  2. 循环求 n 的平方和, 并将 n添加到集合中
  • 如果 n = = 1 n == 1 n==1 , 或者 n 在集合中存在, 跳出循环
  • 返回 n == 1
class Solution:
    def isHappy(self, n: int) -> bool:
        # 求平方和
        def getNext(n):
            total_sum = 0
            while n > 0:
                n, digit = divmod(n, 10)
                total_sum += digit ** 2
            return total_sum
        
        seen = set() # 判断是否重复, 重复了就说明陷入死循环, 不是快乐数
        while n != 1 and n not in seen:
            seen.add(n)
            n = getNext(n)
        return n == 1

解2 快慢指针

思路

  1. 定义一个函数: 求一个数的每个位置上的数字的平方和
  2. 快慢指针, 慢指针每次走一步, 快指针每次走两步
  • 开始时, slow = n, fast = getNext(n)
  • 循环:
    • 循环条件 fast != 1 并且 slow不等于fast
    • slow走一步, fast走两步
  • 返回 n == 1
class Solution:
    def isHappy(self, n: int) -> bool:
        # 求平方和
        def getNext(n):
            total_sum = 0
            while n > 0:
                n, digit = divmod(n, 10)
                total_sum += digit ** 2
            return total_sum
        
        # 双指针(快慢指针)
        slow = n
        fast = getNext(n)
        while fast != 1 and slow != fast:
            slow = getNext(slow)
            fast = getNext(getNext(fast))
        return fast == 1
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值