题目:
202.快乐数

思路:
思路一:暴力破解
按照题意,暴力破解,循环50次以上就退出。
class Solution:def isHappy(self, n: int) -> bool:def bit_square_sum(n):ans= 0while n!=0:ans += pow(n%10, 2)n = n // 10return anscount = 0num = bit_square_sum(n)while count < 50:# print(num)if num != 1:num = bit_square_sum(num)count += 1else:return Truereturn False
思路二:HashSet
思路依然是计算每个数每位的平方和,然后将这个平方和加入hash_set。如果hash_set已经存在这个数且这个数不等于1,说明接下来将会进入无限循环中,就可以退出循环,返回False;如果n==1,退出循环返回True。
def isHappy(self, n: int) -> bool:def get_next(n):total_sum = 0while n > 0:n, digit = divmod(n, 10)total_sum += digit ** 2return total_sumseen = 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 = 0while number > 0:number, digit = divmod(number, 10)total_sum += digit ** 2return total_sumslow_runner = nfast_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
