LeetCode #7 整数反转
题目(英)
Given a 32-bit signed integer, reverse digits of an integer.
Example 1: Input
: 123 Output
: 321
Example 2: Input
: -123 Output
: -321
Example 3: Input
: 120 Output
: 21
Note:
Assume we are dealing with an environment which could only store integers within the 32-bit signed integer range: [−231, 231 − 1]. For the purpose of this problem, assume that your function returns 0 when the reversed integer overflows.
题目(中)
给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转。
示例 1: 输入
: 123 输出
: 321
示例 2: 输入
: -123 输出
: -321
示例 3: 输入
: 120 输出
: 21
注意:
假设我们的环境只能存储得下 32 位的有符号整数,则其数值范围为 [−231, 231 − 1]。请根据这个假设,如果反转后整数溢出那么就返回 0。
Solution 1:直接当成数字按位处理
解法1的核心是是利用取余%
, 将每一位都取出来。然后再依次放入新生成的数中,最后对新生成的数进行判定。
注意:
-
之所以用
abs()
(取绝对值) 是因为比如:-11 % 10 = 9 而我们要的其实是 -1,所以只能通过abs()
将 -11 转换成 11 再 11 % 10 = 1 最后再把 - 还原。 -
利用
% 10
可以每次把个位数取出来,这样倒序的话就是已经取出来的数*10
相当于进位,空出的个位就放新取出来的,这个就有点像队列 - FIFO。 -
//
和/
的区别://
是地板除(除完后保留整数部分);/
是正常的除法。比如:10.1 / 2 = 5.05 ; 10.1 // 2 = 5。我们这里用// 10
来实现移除最后一位的数字。 -
最后的判定,注意看清题目,是对反转后的数字
num
进行判定,再结合大前提也就是输入x
的符号,我们分为三种情况:
● 第一种当x>=0
时,我们需要保证num <= (2**31 - 1)
, 就是 ^(幂);
● 第二种当x < 0
时,我们需要保证num <= (2**31)
, 要注意我们的num
是不带符号的,因为在最开始我们对x
取了绝对值;
● 最后就是num超出范围时,直接返回0。
具体代码如下:
class Solution:
def reverse(self, x: int) -> int:
num = 0
a = abs(x)
while(a != 0):
temp = a%10
num = num*10 + temp
a = a // 10
if 0<=x and num <= (2**31-1): return num
elif 0>x and num <= (2**31) : return -num
else: return 0
Solution 2:将数字当成字符串处理
解法2的核心是把数字利用str(int)
将int
转换成字符串string
,在利用字符串的颠倒进行反转,反转后利用int(string)
将string
转换成整型int
。最后利用一个flag实现符号的判定,加上对新生成的数进行范围判定最后输出结果。该方法比解法1要快。
注意:
-
boolfushu
就是我们的flag,为True
的时候代表负数 -
str()
是 int -> string
int()
是string -> int -
[begin:end:step]
中step = -1
时是代表逆序,注意begin和end是包头不包尾的,也就是数学中的 [begin,end) 或者是 [begin,end-1]。都不写的话默认就是全部的字符串,也就是: begin = 0, end = len(string)。 -
+
是5种字符串连接方法之一,具体可参照链接: link.。join()
也比较常用,如果用join()
实现的话就是:
●a = '-'
●reverseStrx = a.join(['',reverseStrx])
或者是:
●a = ''
●reverseStrx = a.join(['-',reverseStrx])
因为join()
只能是连接list,所以还是直接用+
方便一些。 -
最后判断因为不需要加正负号,所以只判断为零的情况。
具体代码如下:
class Solution:
def reverse(self, x: int) -> int:
boolfushu = False
if x < 0 :
boolfushu = True
x = abs(x)
strx = str(x)
reverseStrx = strx[::-1]
if boolfushu == True:
reverseStrx = '-'+reverseStrx
intStrx = int(reverseStrx)
if intStrx < -(2**31) or intStrx > 2**31-1:
return 0
return intStrx
总结
- 对于有符号的数字运算我们通常都需要用
abs()
转成正数,避免引起一系列的问题。 - 对于数字的处理往往两个思路,一个就当成数字处理,另一个就是转换成字符串再处理。