题目
编写一个算法来判断一个数 n 是不是快乐数。
「快乐数」 定义为:
对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和。
然后重复这个过程直到这个数变为 1,也可能是 无限循环 但始终变不到 1。
如果这个过程 结果为 1,那么这个数就是快乐数。
如果 n 是 快乐数 就返回 true ;不是,则返回 false 。
解题思路
这道题的解题,首先要用到之前用到的对取数值各个位上的单数操作
如果我们单纯只是while下去,当数不是快乐数的情况下我们就会陷入无止境的循环
要知道的一点是,如果求和后的数在之前就出现过了,那么这个数一定不是快乐数了(做快乐数一定很快乐吧!)
由上面这个特点我们可以用到无重复元素的unordered_set,检测到重复元素直接返回false
下面是代码
//采用底层实现是哈希表的unordered_set解决
#include <vector>
#include <unordered_set>
using namespace std;
class Solution
{
public:
int getSum(int num)
{
int sum = 0;
while (num)
{
sum += (num % 10) * (num % 10);
num /= 10;
}
return sum;
}
bool isHappy(int n)
{
unordered_set<int> set;
while (1)
{
int sum = getSum(n);
if (1 == sum) return true;
//原来的set里面有num
if (set.find(sum) != set.end())
{
return false;
}
else
{
set.insert(sum);
}
n = sum;
}
}
};