【leetcode】202. 快乐数( Happy Number )


题目描述

【leetcode】202. 快乐数( Happy Number )

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

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

第一次解答

思路:
本题最大的一个问题就是:是否存在无限重复但不循环的情况?
要回答这个问题,直观上我们可以这么想:本题是通过将每一个数字平方求和得到新的数,由于都是个位数的平方,
每个平方项最大值仅为9^2=81,也就是说每增加一位数字,才能增加最多81的增量,当n为3位数后,例如n=100,
要增加一位数,使得n=1000,则n需要增量900(约等于10^3),而增加这位数字后,按照快乐数的流程,仅仅为下个数增加81的增量,
这就抑制了下一次数的大小,所以我们可以"感觉"得到n不会得到特别大的数(甚至我猜n不会大于3位数),所以n的范围因该是[0,B],
B是一个确定的上届,n应该不会超过这个B,又因为n为整数,所以n为有限个值。
而又因为n为有限个值,所以我们可以得出结论:不会存在无限重复但不循环的情况。
有了上述结论,我们就可以放心的根据“是否n为1”或“是否循环”来决定n是否是快乐数了。
这里用快慢指针

test case:
1
19

代码:

class Solution {
public:
    int next_n(int n){
        int sum = 0;
        while(n > 0){
            int temp = n % 10;
            sum += temp*temp;
            n /= 10;
        }
        return sum;
    }
    bool isHappy(int n) {
        int n_slow = n;
        int n_fast = next_n(n);
        while(true){
            if(1 == n_fast)
                return true;
            if(n_slow == n_fast)
                return false;
            
            n_slow = next_n(n_slow);
            n_fast = next_n(next_n(n_fast));
        }
    }
};

结果:

在这里插入图片描述

相关/参考链接

wang的解答

发布了88 篇原创文章 · 获赞 61 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/a435262767/article/details/104159572