编写一个算法来判断一个数是不是“快乐数”。
一个“快乐数”定义为:对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和,然后重复这个过程直到这个数变为 1,也可能是无限循环但始终变不到 1。如果可以变为 1,那么这个数就是快乐数。
示例:
输入: 19
输出: true
解释:
1^2 + 9^2 = 82
8^2 + 2^2 = 68
6^2 + 8^2 = 100
1^2 + 0^2 + 0^2 = 1
解题思路
我们分析题目发现,我们计算happy number
的过程中有可能出现重复的元素(无限循环),我们可以通过set
记录happy number
,如果出现重复返回False
,否则继续下去,知道出现1
。
我们可以通过递归的办法很快速地解决这个问题
class Solution:
def _isHappy(self, n, sum_set):
if n == 1:
return True
num_sum = 0
while n > 0:
k = n % 10
num_sum += k**2
n //= 10
if num_sum in sum_set:
return False
else:
sum_set.add(num_sum)
return self._isHappy(num_sum, sum_set)
def isHappy(self, n):
"""
:type n: int
:rtype: bool
"""
sum_set = set()
return self._isHappy(n, sum_set)
我们也可以使用迭代的思路解决这个问题,而且更快。
class Solution:
def isHappy(self, n):
"""
:type n: int
:rtype: bool
"""
sum_set = set()
while n != 1:
num_sum = 0
while n > 0:
k = n % 10
num_sum += k**2
n //= 10
if num_sum in sum_set:
return False
else:
sum_set.add(num_sum)
n = num_sum
return True
该问题的其他语言版本添加到了我的GitHub Leetcode
如有问题,希望大家指出!!!