0
点赞
收藏
分享

微信扫一扫

【力扣算法题】快乐数

绣文字 2022-04-05 阅读 62

【力扣算法题】快乐数


文章目录


题目介绍

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

「快乐数」 定义为:

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


题解

1. 哈希集合检测(力扣官方解法1)

这题搞清楚快乐数的原理其实就很好解决了

首先肯定不能无限循环,但我们什么时候才能确定这个数不是快乐数?
答案就是循环,如果两个同样的数出现了,那么必然说明这个数不是快乐数

另外,有没有可能不出现循环呢?
答案是否定的,除了个位数和2位数以外,无论多少位的位数求各位平方和都不可能大于这个位数的最大值
例如:

  • 999 > 3 * (9^2)
  • 9999 > 4 * (9^2)
  • 99999 > 5 *(9^2)

那么剩余的就是解法问题,力扣给的第一个办法是哈希集合检测,没遇到过的数加入集合,再遇到了直接返回false

Python源码(很可惜这题力扣没给C++,但Python看着可真清爽):

def isHappy(self, n: int) -> bool:

    def get_next(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 = get_next(n)

    return n == 1

# 作者:LeetCode-Solution
# 链接:https://leetcode-cn.com/problems/happy-number/solution/kuai-le-shu-by-leetcode-solution/

2. 快慢指针(个人解法/力扣官方解法2)

遇环就快慢指针
理念和上面一样,只是用了经典的链表快慢指针方法来实现

C++源码:

int bitSum(int num)
{
    int result = 0;
    int temp = 0;
    while(num > 0)
    {
        temp = (num % 10);
        result += temp * temp;
        num /= 10;
    }

    return result;
}

bool isHappy(int n) {
    int slowP = n;
    int fastP = n;

    do
    {
        slowP = bitSum(slowP);
        fastP = bitSum(fastP);
        fastP = bitSum(fastP);
    }
    while(slowP != fastP);

    return slowP == 1;
}

(PS: 力扣官方给了第三种方法,我这里没放,纯数学解法,大伙面试就别想着脑筋急转弯了)

举报

相关推荐

0 条评论