题目链接
力扣(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则直接返回trueif(sum==1) return true;if(hash.find(sum) != hash.end()){// 该数存在过,但是不为1则直接返回falsereturn 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则返回falsereturn slow==1;}
};