LeetCode 7:翻转整数,解题之道,不止一种
2023-10-04 20:20:36
前言
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 代码实现。希望本文能够帮助您更好地理解这道题的解法,并为解决其他类似的题目提供帮助。