题目链接
力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台
法一:哈希
使用哈希表循环判断每次经过平方和的数,如果为1则直接返回true,若之前存在过但不为1则直接返回false
代码
class Solution
{
public:
// 计算快乐数
int bitsum(int n)
{
int sum=0;
while(n)
{
int a=n%10;
sum+=a*a;
n/=10;
}
return sum;
}
bool isHappy(int n)
{
unordered_set<int> hash;
while(true)
{
int sum=bitsum(n);
// 如果此次经过bitsum函数之后是1则直接返回true
if(sum==1) return true;
if(hash.find(sum) != hash.end())
{
// 该数存在过,但是不为1则直接返回false
return false;
}
else
{
// 如果不为1也不存在,插入哈希表中
hash.insert(sum);
}
n=sum;
}
}
};
法二:快慢指针
题目解析
判断相遇的时候是否为1,若不为1则返回false,若为1则返回true
代码
class Solution
{
public:
// 计算快乐数
int bitsum(int n)
{
int sum=0;
while(n)
{
int a=n%10;
sum+=a*a;
n/=10;
}
return sum;
}
bool isHappy(int n)
{
// 定义快慢指针
int slow=n,fast=bitsum(n);
// 只要快指针的数不等于慢指针就继续循环调用
while(slow!=fast)
{
slow=bitsum(slow);
fast=bitsum(bitsum(fast));
}
// 看最终相遇位置慢指针是否为1 若不为1则返回false
return slow==1;
}
};