玩转 7 个整数反转算法:LeetCode,思维导图,全解奉上
2023-12-24 08:11:43
导言:整数反转之谜
在编程世界中,整数反转是一个经典且实用的问题。它要求我们编写算法,将给定的整数的所有位数颠倒过来。虽然看似简单,但背后的算法却大有乾坤。在这篇文章中,我们将深入探索 7 种独特的整数反转算法,它们将彻底颠覆你的认知。
算法 1:逐位反转
思维导图:
步骤:
- 初始化一个结果变量
res
为 0。 - 循环遍历给定整数
num
的每一位,从最右端开始。 - 对于每一位
digit
,将其乘以 10 并添加到res
中。 - 重复步骤 2 和 3,直到遍历完所有位。
- 返回
res
。
时间复杂度: O(n),其中 n 是给定整数的位数。
空间复杂度: O(1)。
算法 2:递归
思维导图:
步骤:
- 如果给定整数
num
为 0,则返回 0。 - 否则,将
num
除以 10,并调用递归函数将结果作为参数。 - 返回
num
除以 10 的余数乘以 10 的幂,再加上递归函数的返回值。
时间复杂度: O(n),其中 n 是给定整数的位数。
空间复杂度: O(n),用于递归调用栈。
算法 3:字符串转换
思维导图:
步骤:
- 将给定整数
num
转换为字符串num_str
。 - 使用字符串反转函数反转
num_str
。 - 将反转后的字符串转换回整数并返回。
时间复杂度: O(n),其中 n 是给定整数的位数。
空间复杂度: O(n),用于存储字符串。
算法 4:除余法
思维导图:
步骤:
- 初始化一个结果变量
res
为 0。 - 循环遍历给定整数
num
,不断除以 10 取余。 - 将
res
乘以 10 并加上num
的余数。 - 重复步骤 2 和 3,直到
num
为 0。 - 返回
res
。
时间复杂度: O(n),其中 n 是给定整数的位数。
空间复杂度: O(1)。
算法 5:位操作
思维导图:
步骤:
- 初始化一个结果变量
res
为 0。 - 使用位运算符将
num
的最后一位移位到res
的最高位。 - 将
num
右移一位。 - 重复步骤 2 和 3,直到
num
为 0。 - 返回
res
。
时间复杂度: O(n),其中 n 是给定整数的位数。
空间复杂度: O(1)。
算法 6:二分法
思维导图:
步骤:
- 将给定整数
num
转换为字符串num_str
。 - 使用二分法将
num_str
分成两部分:前半部分和后半部分。 - 将两部分反转并拼接成一个新字符串。
- 将新字符串转换回整数并返回。
时间复杂度: O(n log n),其中 n 是给定整数的位数。
空间复杂度: O(n),用于存储字符串。
算法 7:栈
思维导图:
步骤:
- 初始化一个栈。
- 循环遍历给定整数
num
,将每一位压入栈中。 - 弹出栈中的所有元素,并依次添加到一个结果变量
res
中。 - 返回
res
。
时间复杂度: O(n),其中 n 是给定整数的位数。
空间复杂度: O(n),用于栈。
比较与选择
这 7 种算法各有优缺点。对于较小的整数,逐位反转算法、除余法算法和位操作算法都是不错的选择。对于较大的整数,递归算法和二分法算法更有效率。字符串转换算法和栈算法更通用,但效率较低。
总结
探索整数反转的奇妙世界,让我们对编程世界有了更深入的了解。从逐位反转到栈操作,每种算法都提供了不同的视角,展现了解决问题的多种方式。掌握这些算法,解锁 LeetCode 难题,提升你的编程技能,成为算法大师!