题目:
编写一个算法来判断一个数 n 是不是快乐数。
「快乐数」定义为:
对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和。
然后重复这个过程直到这个数变为 1,也可能是 无限循环 但始终变不到 1。
如果 可以变为 1,那么这个数就是快乐数。
如果 n 是快乐数就返回 true ;不是,则返回 false 。
class Solution {
public:
// 这里写成个函数真是妙吖吖~我自己很难会想到写成一个函数
// 但是后面要调用这个很多很多次,所以把它写成函数是最好的呀~
int getSum(int n)
{
int sum=0;
while(n)
{
sum+=((n%10)*(n%10));
n=n/10;
}
return sum;
}
bool isHappy(int n) {
// point:每个位置上的平方和(sum)可能会出现无限循环
// 当遇到 需要快速判断一个元素是否出现在集合里时,就要想到哈希表
// 因此sum的判断就需要用到哈希表
unordered_set<int> sumNum;
// 最后别忘了更新参数 n 啊!!!!!!!!!!!!!!!
while(1)
{
int sum=getSum(n);
// 注意num有三种状态,
// 第一种就是等于1,就退出循环,返回true
// 第二种开始循环,也退出循环,返回false
// 第三种是非上两种情况,则继续执行循环
if(sum==1)
{
return true;
}
// 如果不等于尾后迭代器,则说明已经出现过了,
// 也就是进入了无限循环,那么就立即返回
if(sumNum.find(sum)!=sumNum.end())
{
return false;
}
else
{
// 没有出现过,且不等于1,那就把num先存入容器,进入下一轮循环
sumNum.insert(sum);
}
// 最后别忘了更新参数 n 啊!!!!!!!!!!!!!!!
n=sum;
}
}
};