快乐数(双指针解法)
题目链接202. 快乐数 - 力扣(LeetCode)
题目拆解
1 取一个正整数每一位的平方和为,如果为1那么直接可以判定为快乐数,如果不为1,就重复这个过程,直到出现1
2 实际上,这道题只有两种情况,并且两种情况都会出现循环,1不管怎么重复操作的得到的都是1,各位数2不管怎么操作还是2,不存在无限循环的不同个体
3 所以我们这里可以很自然的就联想到快慢指针来找循环的方法,相遇的时候刚好是进入循环的时候
解题步骤
1 可以先包装平方和的操作,方便主函数中直接调用
2 接着写函数主体,先设置初始值,slow指=指针指向第一位,fast指针指向第二位,接着让slow指针调用一次sum函数,相当于走一步;让fast指针调用两次sum,相当于走两步
3 最后根据相遇的时候二者的值就可以直接返回了
class Solution {
public:
int sum(int n)
{int sum=0;//返回平方和之后的数while(n>0){int m=n%10;sum+=m*m;n/=10;}return sum;
}bool isHappy(int n){int slow=n;int fast=sum(n);while(fast!=slow)//相遇的时候进入循环{slow=sum(slow);fast=sum(sum(fast));}//都为1的时候说明为快乐数return slow==1;}
};