一、题目解析
二、算法分析
题目已经指出,一个数只有循环和1两种情况,实际上这两种情况可以看作一种情况:
进入循环:实际上是通过题目中的各位平方和计算,得出了一个先前计算在出现的数,从而产生 循环。(像是判断链表是否有环一样)
得1:实际上就是长度为1的循环。
所以我们考虑用快慢指针来解决:
三、代码编写
class Solution {
public:
//计算每一位的平方和
int caculate(int a)
{
vector<int> arr;
//取到每一位,放到vector中
while(a)
{
arr.push_back(a%10);
a/=10;
}
int sum=0;
for(int i=0;i<arr.size();i++)
{
sum=sum+arr[i]*arr[i];
}
return sum;
}
bool isHappy(int n) {
//定义快慢指针(这里定义不同是为了进入下面的循环)
int slow=n;
int fast=caculate(n);
//当快慢指针数相同时,表面相遇,跳出循环
while(slow!=fast)
{
slow=caculate(slow);
fast=caculate(caculate(fast));
}
//到这里,fast和slow已经相同
//若果两者均为1,就是快乐数
if(fast==1||slow==1)
{
return true;
}
return false;
}
};