python 算法题——快乐数的多种解法

  • Post category:Python

下面是关于“Python算法题——快乐数的多种解法”的完整攻略。

1. 题目描述

快乐数是指:对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和,然后重复这个过程直到这个数变为 1,或者是无限循环但始终变不到 1。如果可以变为 1,那么这个数就是快乐数。

例如,19 是一个快乐数,计算过程如下:

1^2 + 9^2 = 82
8^2 + 2^2 = 68
6^2 + 8^2 = 100
1^2 + 0^2 + 0^2 = 1

2. 解法一:使用集合判断是否进入循环

我们可以使用一个集合来存储每次计算的结果,如果出现重复的结果,说明进入了循环,此时可以直接返回 False。如果最终计算结果为 1,则返回 True。

以下是使用集合判断是否进入循环的 Python 代码:

def isHappy(n: int) -> bool:
    seen = set()
    while n != 1 and n not in seen:
        seen.add(n)
        n = sum(int(i) ** 2 for i in str(n))
    return n == 1

下面是一个使用该函数的示例:

print(isHappy(19))  # True
print(isHappy(2))   # False

在这个示例中,我们使用 isHappy() 函数来判断 19 和 2 是否为快乐数,并打印结果。

3. 解法二:使用快慢指针判断是否进入循环

我们可以使用快慢指针来判断是否进入循环。快指针每次计算两次,慢指针每次计算一次,如果快指针和慢指针相等,说明进入了循环,此时可以直接返回 False。如果最终计算结果为 1,则返回 True。

以下是使用快慢指针判断是否进入循环的 Python 代码:

def isHappy(n: int) -> bool:
    def get_next(n):
        return sum(int(i) ** 2 for i in str(n))
    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

下面是一个使用该函数的示例:

print(isHappy(19))  # True
print(isHappy(2))   # False

在这个示例中,我们使用 isHappy() 函数来判断 19 和 2 是否为快乐数,并打印结果。

4. 总结

快乐数是指一个正整数每次将该数替换为它每个位置上的数字的平方和,然后重复这个过程直到这个数变为 1,或者是无限循环但始终变不到 1。我们可以使用集合或快慢指针来判断一个数是否为快乐数。如果出现重复的结果,说明进入了循环,此时可以直接返回 False。如果最终计算结果为 1,则返回 True。