编写一个算法来判断一个数 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 + 0^2 = 1
递归解法
不是快乐数的数称为不快乐数(unhappy number),所有不快乐数的数位平方和计算,最后都会进入 4 → 16 → 37 → 58 → 89 → 145 → 42 → 20 → 4 的循环中
已知规律: [1 ~ 4] 中只有 1 是快乐数,[5 ~ ∞] 的数字要么回归到 1 要么回归到 4 或 3
因此仅需在 n > 4 时调用递归
class Solution:
def isHappy(self, n: int) -> bool:
return self.isHappy(sum(int(i) ** 2 for i in str(n))) if n > 4 else n == 1
集合解法
class Solution:
def isHappy(self, n: int) -> bool:
seen = {1}
while n not in seen:
seen.add(n)
n = sum(int(i) ** 2 for i in str(n))
return n == 1
哈希迭代
class Solution:
def isHappy(self, n: int) -> bool:
n = str(n)
visited = set()
while 1:
n = str(sum(int(i) ** 2 for i in n))
if n == "1":
return True
if n in visited:
return False
visited.add(n)
快慢跑
class Solution:
def isHappy(self, n: int) -> bool:
n = str(n)
slow = n
fast = str(sum(int(i) ** 2 for i in n))
while slow != fast:
slow = str(sum(int(i) ** 2 for i in slow))
fast = str(sum(int(i) ** 2 for i in fast))
fast = str(sum(int(i) ** 2 for i in fast))
return slow == "1"
class Solution:
def isHappy(self, n: int) -> bool:
issam = [n]
while n != 1:
a = list(str(n))
n = 0
for i in a:
n += pow(int(i),2)
issam.append(n)
if len(issam) != len(set(issam)):
return False
return True
来源:力扣(LeetCode)
网友评论