题目
    202.快乐数
    image.png
    image.png

    思路
    思路一:暴力破解
    按照题意,暴力破解,循环50次以上就退出。

    1. class Solution:
    2. def isHappy(self, n: int) -> bool:
    3. def bit_square_sum(n):
    4. ans= 0
    5. while n!=0:
    6. ans += pow(n%10, 2)
    7. n = n // 10
    8. return ans
    9. count = 0
    10. num = bit_square_sum(n)
    11. while count < 50:
    12. # print(num)
    13. if num != 1:
    14. num = bit_square_sum(num)
    15. count += 1
    16. else:
    17. return True
    18. return False

    思路二:HashSet
    思路依然是计算每个数每位的平方和,然后将这个平方和加入hash_set。如果hash_set已经存在这个数且这个数不等于1,说明接下来将会进入无限循环中,就可以退出循环,返回False;如果n==1,退出循环返回True。

    1. def isHappy(self, n: int) -> bool:
    2. def get_next(n):
    3. total_sum = 0
    4. while n > 0:
    5. n, digit = divmod(n, 10)
    6. total_sum += digit ** 2
    7. return total_sum
    8. seen = set()
    9. while n != 1 and n not in seen:
    10. seen.add(n)
    11. n = get_next(n)
    12. return n == 1

    思路三:快慢指针

    • 只要存在环,快慢指针最终会相交
    • 不存在环,快指针会比慢指针先到达终点

    不用担心快指针会跳过1的情况。假设第2次循环就得到n==1,那么第三次循环还是得到n==1,这样快指针还是先达到终点。
    image.png

    1. def isHappy(self, n: int) -> bool:
    2. def get_next(number):
    3. total_sum = 0
    4. while number > 0:
    5. number, digit = divmod(number, 10)
    6. total_sum += digit ** 2
    7. return total_sum
    8. slow_runner = n
    9. fast_runner = get_next(n)
    10. while fast_runner != 1 and slow_runner != fast_runner:
    11. slow_runner = get_next(slow_runner)
    12. fast_runner = get_next(get_next(fast_runner))
    13. return fast_runner == 1