【LeetCode 202】快乐数

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

题目描述

  快乐数 定义为:

  • 对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和。
  • 然后重复这个过程直到这个数变为 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);
			}
		}
	}
};

或许有同学会想到暴力去解决,但是我们无法知道最大的死循环次数会是多少,无法确定外层循环的循环次数。个人不建议这样去做,我们要知道死循环代表的什么,就是重复计算之前计算过的值。用这一个作为递归结束条件,就能很快写出递归。
欢迎交流和补充~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值