力扣题库之快乐数

快乐数

编写一个算法来判断一个数 n 是不是快乐数
  • 题目描述 : 快乐数」定义为:对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和,然后重复这个过程直到这个数变为 1,也可能是 无限循环 但始终变不到 1。如果 可以变为 1,那么这个数就是快乐数。
    // 如果 n 是快乐数就返回 True ;不是,则返回 False 。
  • 示例 :
示例 : 输入:19
					输出:true
					解释:
					1^2 + 9^2 = 82
					8^2 + 2^2 = 68
					6^2 + 8^2 = 100
					1^2 + 0^2 + 02 = 1 
  • 思路 : 通过示例可以很清楚的知道,所谓的快乐数,就是将每一位数字的平方和相加,如果最后的结果为1,那么就是快乐数了。
  • 怎么判断结束条件(不是快乐数)呢?
    以2为例 : 2->4->16->37->58->89->145->42->24->20->4
    这个时候就与前面重复了,那么他一定会陷入死循环,这时可以判定他不是快乐数了
递归方法
var obj = {};			
			var isHappy = function(n) {
				n += "";
				var num = 0;				
				//遍历字符串,获得str每一位的平方和				
				for (var i = 0; i < n.length; i++) {
					//num为每一位的平方和					
					num += n[i] * n[i]
				}				
				if (num === 1) return true;
				//在数组中找到了相同的数,那么返回false
				if (obj[num]) {
					return false;
				}
				obj[num]=num;				
				return isHappy(num);
			};
  • 因为是算法题,递归方法时间复杂度有点高,虽然代码逻辑没问题,但是力扣解析器会直接报错,所以我又用了第二种方法:循环(下面代码)
var isHappy = function(n) {
				var obj = {};
				n += "";				
				var num = 0;				
				//遍历字符串,获得str每一位的平方和
				while(num !== 1){
					num = 0;
					for (var i = 0; i < n.length; i++) {
						//num为每一位的平方和					
						num += n[i] * n[i]
					}
					n = num + ""
					if (obj[num]) {
						return false;
					}					
					obj[num]=num;
				}
				return true;
				//在数组中找到了相同的数,那么返回false												
			};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值