![](https://img-blog.csdnimg.cn/3d11a51e954345c4bb488d1197f2753c.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBATHVqY34=,size_20,color_FFFFFF,t_70,g_se,x_16)
1、运用双指针
class Solution {
public:
//定义求各位数平方和的函数
int getsum(int n)
{
int sum = 0;
while(n)
{
sum += (n % 10) * (n % 10);
n /= 10;
}
return sum;
}
//运用快慢指针,快走两步,慢走一步;如果快能变到1,则1会一直循环,慢也会到达1
bool isHappy(int n) {
int slow = n;
int fast = n;
//用do-whlie语句,slow和fast起初相等
do{
slow = getsum(slow);
fast = getsum(fast);
fast = getsum(fast);
}
while(fast != slow);
if(fast == 1)
{
return true;
}
return false;
}
2、运用哈希表
class Solution {
public:
//定义求各位数平方和的函数
int getsum(int n)
{
int sum = 0;
while(n)
{
sum += (n % 10) * (n % 10);
n /= 10;
}
return sum;
}
bool isHappy(int n)
{
unordered_set<int> s;
while(true)
{
int sum = getsum(n);
if(sum == 1)//sum为1则返回true
return true;
if(s.find(sum) != s.end())//sum已经出现过,说明陷入无限循环了
{
return false;
}
else
s.insert(sum);
n = sum;
}
}
};