题目 reverse
给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转。
示例 1:
输入: 123
输出: 321
示例 2:
输入: -123
输出: -321
示例 3:
输入: 120
输出: 21
注意:
假设我们的环境只能存储得下 32 位的有符号整数,则其数值范围为 [
−
2
31
−2^{31}
−231,
2
31
−
1
2^{31} − 1
231−1]。请根据这个假设,如果反转后整数溢出那么就返回 0。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/reverse-integer
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解题:
暴 力 破 解 法 : \color{#4285f4}{暴力破解法:} 暴力破解法:
看到题的第一眼是蒙的…不得不说还是学渣啊…
镇定下来开始仔细看题,有符号无符号,c语言学过,python里的整数和C语言类似,有
(
无
符
号
)
\color{green}{(无符号)}
(无符号)和
(
有
符
号
)
\color{green}{(有符号)}
(有符号)之分,题中明确给出的是32 位的有符号整数,按这道题来理解就是带不带正负号的整数。其实这道题没有那么复杂的思想,就是正数还是负数。
再接着审题的时候发现有个词叫整数溢出,有点不理解就百度了一下结合一些大神给出的理解,用人话翻译了一下。
整
数
溢
出
:
\color{red}{整数溢出:}
整数溢出:所有数存在内存里是有固定的长度的,所以数的取值是有范围的,当数的取值超过所给定的范围时,就会从起点开始重新再计数,这个就叫整数溢出。
例子:用带计数的跳绳运动时,计数器最高是999,当跳绳超过999时,就会清零重新计数,总数就是999+计数器的数。
题目中已经给出取值范围为[
−
2
31
−2^{31}
−231,
2
31
−
1
2^{31} − 1
231−1],而且说明如果反转后整数溢出那么就返回 0,用if条件做出判断就可以。
return x if -2147483648 < x < 2147483647 else 0 # 判断有没有整数溢出
接下来就是这题完整代码
class Solution:
def reverse(self, x: int):
if -10 < x < 10: # 判断是否是个位数 个位数不用反转
return x
str_x = str(x) # 将整数x转为字符型
if str_x[0] == '-': # 判断x是否为负数
str_x = str_x[1:][::-1] # 是负数,从字符串第一个位置开始取值(去掉符号),把数翻转
x = int(str_x)
x = -x
else:
str_x = str_x[::-1] # 不是负数直接反转即可
x = int(str_x)
return x if -2147483648 < x < 2147483647 else 0 # 判断有没有整数溢出
这段代码基本分为三个部分:
- 判断x是否是个位数
- 判断x是正数还是负数
- 判断是否正数溢出
第一次看这个代码的时候可以从后往前看 3-1-2
其中用的方法是python很基础的东西 字符串的切片操作
加 算 法 : \color{#4285f4}{加算法:} 加算法:
官方解释
方法:弹出和推入数字 & 溢出前进行检查
算法
反转整数的方法可以与反转字符串进行类比。
我们想重复“弹出” x x x 的最后一位数字,并将它“推入”到 rev 的后面。最后,rev 将与 x x x 相反。
要在没有辅助堆栈 / 数组的帮助下 “弹出” 和 “推入” 数字,我们可以使用数学方法。
作者:LeetCode
链接:https://leetcode-cn.com/problems/reverse-integer/solution/zheng-shu-fan-zhuan-by-leetcode/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
待我用人话解释一下
就是算法里的
出
栈
和
入
栈
\color{red}{出栈和入栈}
出栈和入栈,栈是什么,这么想就是竖过来的列表,最先进来的就在下面,后进来的在上面。(可能不太准确)
x
x
x就是给的数,
r
e
v
rev
rev是用来保存经过计算后被弹出的数,实际上就是反转后的数
给个例子就理解了:
给的数是123,那么
x
=
123
x=123
x=123,
rev = 0
while x != 0:
rev = rev*10 + x%10
x = x//10
print(rev, x)
把123带进去算一遍,就能理解rev和
x
x
x的作用分别是什么了
rev和x
完整代码:
class Solution:
def reverse(self, x: int) -> int:
if -10 < x < 10: # 判断是否是个位数 个位数不用反转
return x
flat = 1 # 正数标记为1
if x < 0: # 如果x是负数,将x转为正数,方便计算
flat = -1 # 负数标记为-1
x = flat * x
# 算是算法吧
rev = 0
while x != 0:
rev = rev*10 + x%10
x = x//10
rev = rev * flat # 上面将负数转为了正数,现在变回负数输出
return rev if -2147483648 < rev < 2147483647 else 0 # 判断有没有整数溢出
为了尊重原创,还是贴一下我看到其代码后理解了官方解题思路
https://www.jianshu.com/p/ba7b6564a503
总结
说实话,第二部分真不想写,因为真心觉得python切片就已经很简单了,但是抱着学习的态度,还是得学啊,阿西吧。
第二天
over