返回

LeetCode 7:翻转整数,解题之道,不止一种

前端

前言

LeetCode 作为程序员的修炼场,其中的题目涵盖了各种数据结构和算法的应用。而数组类型题目,更是 LeetCode 中不可或缺的一部分。数组,作为一种简单而高效的数据结构,在现实生活中有着广泛的应用,比如存储学生成绩、记录商品信息、管理用户数据等等。LeetCode 中的数组类型题目,往往涉及到数组的遍历、排序、查找、插入和删除等基本操作,因此掌握这些基本操作对于解决 LeetCode 数组类型题目至关重要。

解题思路

LeetCode 7: 翻转整数 这道题要求我们将给定的 32 位有符号整数翻转。例如,输入 123,输出应为 321。解决这道题有多种方法,每种方法都有其独特的优点和缺点。下面,我们将介绍三种最常见的方法:

方法一:字符串翻转

字符串翻转法是一种简单而直观的方法。首先,我们将整数转换为字符串,然后使用字符串内置的 reverse() 函数进行翻转,最后将翻转后的字符串转换为整数即可。这种方法的优点是代码简洁,易于理解和实现。然而,这种方法存在一个潜在的问题:如果输入的整数过大,可能会导致内存溢出。

方法二:除法取余法

除法取余法是一种效率较高的算法。首先,我们将整数不断除以 10,并将余数压入栈中。当整数除以 10 后为 0 时,说明整数已经全部被分解成个位数字。此时,我们将栈中的数字依次弹出,并组合成翻转后的整数即可。这种方法的优点是效率较高,并且不会产生内存溢出。然而,这种方法的缺点是代码实现稍微复杂一些。

方法三:位运算法

位运算法是一种非常巧妙的算法。首先,我们将整数转换为二进制形式,然后从二进制数的末尾开始,依次将每一位数字与最高位进行交换。当所有位都交换完成时,我们就得到了翻转后的整数。这种方法的优点是效率极高,并且不会产生内存溢出。然而,这种方法的缺点是代码实现稍微复杂,对于不熟悉位运算的读者来说,可能难以理解。

代码实现

下面,我们分别给出这三种方法的 Python 代码实现:

方法一:字符串翻转

def reverse_integer_string(x):
    """
    翻转整数(字符串翻转法)

    :param x: 要翻转的整数
    :return: 翻转后的整数
    """

    # 将整数转换为字符串
    x_str = str(x)

    # 使用字符串内置的 reverse() 函数进行翻转
    x_reversed_str = x_str[::-1]

    # 将翻转后的字符串转换为整数
    x_reversed = int(x_reversed_str)

    # 返回翻转后的整数
    return x_reversed


# 测试
print(reverse_integer_string(123))  # 输出:321
print(reverse_integer_string(-123))  # 输出:-321

方法二:除法取余法

def reverse_integer_division(x):
    """
    翻转整数(除法取余法)

    :param x: 要翻转的整数
    :return: 翻转后的整数
    """

    # 将整数转换为绝对值
    x = abs(x)

    # 初始化翻转后的整数
    reversed_x = 0

    # 不断除以 10,并将余数压入栈中
    while x > 0:
        reversed_x = reversed_x * 10 + x % 10
        x //= 10

    # 判断原整数是否为负数,如果是,则加上负号
    if x < 0:
        reversed_x = -reversed_x

    # 返回翻转后的整数
    return reversed_x


# 测试
print(reverse_integer_division(123))  # 输出:321
print(reverse_integer_division(-123))  # 输出:-321

方法三:位运算法

def reverse_integer_bitwise(x):
    """
    翻转整数(位运算法)

    :param x: 要翻转的整数
    :return: 翻转后的整数
    """

    # 将整数转换为 32 位二进制数
    x_binary = bin(x)[2:]

    # 初始化翻转后的二进制数
    reversed_x_binary = ''

    # 从二进制数的末尾开始,依次将每一位数字与最高位进行交换
    for i in range(len(x_binary) - 1, -1, -1):
        reversed_x_binary += x_binary[i]

    # 将翻转后的二进制数转换为整数
    reversed_x = int(reversed_x_binary, 2)

    # 返回翻转后的整数
    return reversed_x


# 测试
print(reverse_integer_bitwise(123))  # 输出:321
print(reverse_integer_bitwise(-123))  # 输出:-321

比较

这三种方法各有优缺点。字符串翻转法简单易懂,但效率较低。除法取余法效率较高,但代码实现稍显复杂。位运算法效率极高,但代码实现最为复杂。因此,在实际应用中,我们可以根据具体情况选择合适的方法。

结语

在本文中,我们探讨了 LeetCode 7: 翻转整数 这道题的多种解法。我们介绍了字符串翻转法、除法取余法和位运算法这三种最常见的方法,并对它们的优点和缺点进行了分析。我们还提供了每种方法的 Python 代码实现。希望本文能够帮助您更好地理解这道题的解法,并为解决其他类似的题目提供帮助。