在做题中学习(38):快乐数

202. 快乐数 - 力扣(LeetCode)

在做题中学习(38):快乐数_第1张图片

理解:根据定义一共有两种情况

1.最后变为1

2.最后变为环

在做题中学习(38):快乐数_第2张图片

在做题中学习(38):快乐数_第3张图片

思路:可以把两个情况都认为有环,第一个是环一直为1

(快满指针法) 定义一个快指针和慢指针,慢指针走一步,快指针走两步。

而这里的指针不是真正的指针,可以用整型值代替它所代表的意义,比如:19会变化为82,那slow就由19经过平方和变化为82,fast走两步相当于19变化为82在变化为68,相当于变化两次,用这样伪指针的做法来表示快慢指针。

解释一下下面代码:把求平方和封装成函数更方便,fast首先定义为bitsum(n)是因为若定义为n循环进不去。

class Solution 
{
public:
    int bitsum(int n)
    {
        int sum = 0;
        while(n)
        {
            int t = n%10;
            sum += t*t;
            n = n/10;
        }
        return sum;
    }
    bool isHappy(int n) 
    {
        int slow = n, fast = bitsum(n);
        while(slow!=fast)
        {
            slow = bitsum(slow);
            fast = bitsum(bitsum(fast));
        }
        return slow ==1;
    }
};

你可能感兴趣的:(学习,算法,c++,快慢指针法)