题目:
202.快乐数
思路:
思路一:暴力破解
按照题意,暴力破解,循环50次以上就退出。
class Solution:
def isHappy(self, n: int) -> bool:
def bit_square_sum(n):
ans= 0
while n!=0:
ans += pow(n%10, 2)
n = n // 10
return ans
count = 0
num = bit_square_sum(n)
while count < 50:
# print(num)
if num != 1:
num = bit_square_sum(num)
count += 1
else:
return True
return False
思路二:HashSet
思路依然是计算每个数每位的平方和,然后将这个平方和加入hash_set。如果hash_set已经存在这个数且这个数不等于1,说明接下来将会进入无限循环中,就可以退出循环,返回False;如果n==1,退出循环返回True。
def isHappy(self, n: int) -> bool:
def get_next(n):
total_sum = 0
while n > 0:
n, digit = divmod(n, 10)
total_sum += digit ** 2
return total_sum
seen = set()
while n != 1 and n not in seen:
seen.add(n)
n = get_next(n)
return n == 1
思路三:快慢指针
- 只要存在环,快慢指针最终会相交
- 不存在环,快指针会比慢指针先到达终点
不用担心快指针会跳过1的情况。假设第2次循环就得到n==1,那么第三次循环还是得到n==1,这样快指针还是先达到终点。
def isHappy(self, n: int) -> bool:
def get_next(number):
total_sum = 0
while number > 0:
number, digit = divmod(number, 10)
total_sum += digit ** 2
return total_sum
slow_runner = n
fast_runner = get_next(n)
while fast_runner != 1 and slow_runner != fast_runner:
slow_runner = get_next(slow_runner)
fast_runner = get_next(get_next(fast_runner))
return fast_runner == 1