思路:首先把 n 转为 str,再循环乘平方并相加,转为新的 n,一直循环下去。此时会超时,因为有些数字会一直循环下去。所以添加一个循环链加以判断。
# 循环链
# 首先把 n 转为 str,再循环乘平方并相加,转为新的 n,一直循环下去。
# 此时会超时,因为有些数字会一直循环下去。
# 所以添加一个循环链加以判断。
class Solution:
def isHappy(self, n: int) -> bool:
cycle_number = [4, 16, 37, 58, 89, 145, 42, 20]
while n != 1:
s = str(n)
ans = 0
for i in range(len(s)):
ans += int(s[i]) ** 2
if ans in cycle_number:
break
n = ans
if n == 1:
return True
if n == 1:
return True
return False
方法二:set+while
思路:思路和上面基本一致,不同在于此算法用 set 容器来存储循环数字。
# set + while
# 思路和上面基本一致,不同在于此算法用 set 容器来存储循环数字。
class Solution:
def isHappy(self, n: int) -> bool:
ans_set = set()
while n != 1:
ans = 0
for i in range(len(str(n))):
ans += int(str(n)[i]) ** 2
if ans in ans_set:
break
ans_set.add(ans)
n = ans
if n == 1:
return True
if n == 1:
return True
return False
方法三:快慢指针
思路:用快慢指针来替代循环链,也就是说,如果存在循环链,快慢指针最终会相遇。如果不存在循环链,直接返回 fast == 1 即可。
# 快慢指针
# 用快慢指针来替代循环链,也就是说,如果存在循环链,快慢指针最终会相遇。
# 如果不存在循环链,直接返回 fast == 1 即可。
class Solution:
def isHappy(self, n: int) -> bool:
def get_next(number):
number = str(number)
ans = 0
for i in range(len(number)):
ans += int(number[i]) ** 2
return ans
slow, fast = n, get_next(n)
while fast != 1 and slow != fast:
slow = get_next(slow)
fast = get_next(get_next(fast))
return fast == 1