题目描述
快乐数 定义为:
- 对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和。
- 然后重复这个过程直到这个数变为 1,也可能是 无限循环 但始终变不到 1。
- 如果这个过程 结果为 1,那么这个数就是快乐数。
如果 n 是 快乐数 就返回 true ;不是,则返回 false 。
示例1
输入:n = 19
输出:true
解释:
12 + 92 = 82
82 + 22 = 68
62 + 82 = 100
12 + 02 + 02 = 1
示例2
输入:n = 2
输出:false
知道你们懒得计算画,“舅”宠你们。解释

通过上面的图和示例1中的解释你或许有了思路,自己可以先动手操作一下。再看下面的解题思路。
解题思路
递归
通过上图可以知道,如果不是快乐数,经过n次计算,一定会进入一个死循环,也就是会得到之前重复计算过的数(利用哈希表解决这一问题)。快乐数经过有限次计算得到1。用这两个条件作为递归结束的条件,就能很快写出递归。
class Solution {
public:
unordered_set<int> ans;//利用哈希表判断当前数值是否计算过
bool isHappy(int n) {
int x=0;
while(n){
x+=pow(n%10,2);
n=n/10;
}
if(x==1)//是快乐数
return true;
else{
if(ans.count(x)==1)//该数字前面计算过,不是快乐数
return false;
else{
ans.insert(x);
return isHappy(x);
}
}
}
};
或许有同学会想到暴力去解决,但是我们无法知道最大的死循环次数会是多少,无法确定外层循环的循环次数。个人不建议这样去做,我们要知道死循环代表的什么,就是重复计算之前计算过的值。用这一个作为递归结束条件,就能很快写出递归。
欢迎交流和补充~

本文介绍了一种通过递归算法来判断一个数是否为快乐数的方法。快乐数是指一个正整数,通过将其每一位数字的平方和不断迭代计算,最终能得到1的数。文章详细解析了递归算法的实现细节,并提供了C++示例代码。
1060

被折叠的 条评论
为什么被折叠?



