《算法题》是个系列文章,题主要来自 LeetCode,每道题我尽量使用两种以上的方法来解决,一种是好理解,但是可能性能差,一种需要花点功夫理解,但是性能好,所以题均由 Python 实现
先看下题目要求
给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转。
示例 1:
输入: 123 输出: 321
示例 2:输入: -123 输出: -321
示例 3:输入: 120 输出: 21
注意: 假设我们的环境只能存储得下 32 位的有符号整数,则其数值范围为 [−231, 231 − 1]。请根据这个假设,如果反转后整数溢出那么就返回 0。
使用字符串
提到翻转,我们第一反应是使用字符串,因为是探讨算法,我们不使用语言的特性,比如 a[::-1]
就直接可以实现字符串翻转。
1 | #!/usr/bin/env python |
这个算法看上去并不简洁,因为题目的限制,逻辑上显得比较复杂,我们再看一下使用数学的方式翻转。
数学运算
这个算法的思路还是像字符串一样,将 x
的最后一位推出,并推到 r
的前边。
推出最后一位,我们使用取余的方式。
1 | #!/usr/bin/env python |
再看这次代码,现在逻辑简洁了很多,我们使用测试用例测试结果
1 | #!/usr/bin/env python |
1 | $ python 7_reverse_integer.py |
我们再来测试下他们的运行速度
1 | #!/usr/bin/env python |
1 | $ python 7_reverse_integer.py |
运行了,发现有点奇怪,理论上 reverse2
时间复杂度要更小,但结果并不是这样,可能是我测试的方式不对。
即使时间有差距,但也不大,还是更推荐第二种算法,因为逻辑更简单,也不容易出错。
完整代码地址:https://github.com/wxnacy/study/blob/master/python/leetcode/7_reverse_integer.py
该题来自 LeetCode