【力扣题】题目描述:
【Python3】代码:
1、解题思路:用哈希集合检测循环。设置集合记录每次结果,判断结果是否为1。若计算结果已在集合中则进入循环,结果一定不为1。
(1-1)知识点:集合:元素不重复的序列,大括号“{}”,元素之间逗号“,”隔开。
str(...):转为字符串。为了遍历每一个数字。
int(...):转为整数。为了进行数学运算。
sum(...):求和。
集合.add(...):往集合中添加元素。
class Solution:
def isHappy(self, n: int) -> bool:
res = {n} # 将最初的n加入集合
while n != 1:
n = sum(int(x)**2 for x in str(n)) # 每一位数字的平方再求和
if n in res: return False
else: res.add(n)
return True
(1-2)知识点:set( ):创建空集合。
map(函数,序列):序列映射。序列中每一个元素调用函数执行操作,返回新序列。
注解:此处的 return n==1 相当于 if n==1:return True; else: return False
class Solution:
def isHappy(self, n: int) -> bool:
res = set() # 创建空集合
while n != 1 and n not in res:
res.add(n)
n = sum(map(lambda x:int(x)**2,str(n))) # 每一位数字的平方再求和
return n == 1
(1-3)知识点:n % 10:十进制的数字获取最低位。
n // 10:十进制的数字去除最低位,相当于右移。
class Solution:
def isHappy(self, n: int) -> bool:
# 计算每一位的数字的平方再求和,返回计算结果
def get_next(n):
total = 0
while n > 0:
total += (n % 10) ** 2
n //= 10
return total
# 判断是否为1
res = set()
while n != 1:
res.add(n)
n = get_next(n)
if n in res: return False
return True
2、解题思路:快慢指针。慢指针计算一次,快指针计算两次,判断是否为1。若快指针和慢指针相同且不为1,则进入循环,结果一定不为1。
注解:slow,fast = n,get_next(n) 相当于 slow=n;fast=get_next(n)。
class Solution:
def isHappy(self, n: int) -> bool:
# 计算每一位的数字的平方再求和,返回计算结果
def get_next(n):
total = 0
while n > 0:
total += (n % 10) ** 2
n //= 10
return total
slow,fast = n,get_next(n)
while slow != fast:
slow = get_next(slow)
fast = get_next(get_next(fast))
return fast == 1
3、解题思路:数学。大量求解得出的数学规律,结果不为1的循环为4→16→37→58→89→145→42→20→4。因此只要计算结果在这个循环中,一定不为1。
class Solution:
def isHappy(self, n: int) -> bool:
cycle_num = {4,16,37,58,89,145,42,20} # 集合
while n not in cycle_num:
n = sum(map(lambda x:int(x)**2,str(n))) # 每一位数字的平方再求和
if n == 1: return True
return False