算法精品课 202. 快乐数

109 阅读1分钟

202. 快乐数 - 力扣(LeetCode)

如果有单个数,例如8 ,那么应该让它乘自身,例如 8=64=52=……

假设我们从数字 19 开始计算:

- 1^2 + 9^2 = 82
- 8^2 + 2^2 = 68
- 6^2 + 8^2 = 100
- 1^2 + 0^2 + 0^2 = 1

在这个例子中,我们最终得到了 1,因此 19 是一个 happy number。但是如果我们从数字 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

在这个例子中,我们最终又回到了 4,说明我们陷入了一个循环。
因此,如果我们在计算过程中得到了一个已经出现过的数字,就说明
我们陷入了一个循环,应该返回 false

也就是说我们求这道题的解一定会得到两个解:

1.最后一定可以求到1这个值,说明是快乐数

image.png

2.最后会求到本身,说明有环,并且在环中求不到1,不是快乐数:

image.png

3.在环中求导1,是快乐数

既然可能有环,那么我们可以用快慢指针的方法,如果快慢指针在环中相遇,那么这个数肯定是1,否则就不是。

快慢指针初始状态:

image.png 开始走,slow一次走一步,fast一次走两步:

image.png


    int step(int n)
    { int sum=0;
        while(n)
        {
            int t=n%10;
            sum+=t*t;
            n/=10;
        }
        return sum;
    }
    
    bool isHappy(int n) {
    
    int slow=n;
    int fast=step(n);
    while(slow!=fast)
    {
        slow=step(slow);
        fast=step(step(fast));
    } if(fast==1)return true;
return false;