编写一个算法来判断一个数是不是“快乐数”。
一个“快乐数”定义为:对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和,然后重复这个过程直到这个数变为 1,也可能是无限循环但始终变不到 1。如果可以变为 1,那么这个数就是快乐数。
示例:
输入: 19
输出: true
解释:
12 + 92 = 82
82 + 22 = 68
62 + 82 = 100
12 + 02 + 02 = 1
思路:
按照题目要求每次计算出新的数sum,判断sum是否等于1,如果等于,则返回true
关键点在于怎么判断永远得不到1:我们可以用一个集合把每次计算出的sum放进去,如果sum已经在集合中,证明出现了死循环,是永远得不到1的,那么就可以停止循环,返回false
class Solution {
public:
bool isHappy(int n) {
set<int> s;
int k = n;
int sum = 0;
while(1)
{
sum += (k%10)*(k%10);
k = k/10;
if(k == 0)
{
if(s.find(sum) == s.end())
s.insert(sum);
else
break;
if(sum == 1)
return true;
else
{
k = sum;
sum = 0;
}
}
}
return false;
}
};
效率:
100%