题目
给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转。
示例 1:
输入: 123
输出: 321
示例 2:
输入: -123
输出: -321
示例 3:
输入: 120
输出: 21
注意:
假设我们的环境只能存储得下 32 位的有符号整数,则其数值范围为[-2^31 ,2^31-1] 。请根据这个假设,如果反转后整数溢出那么就返回 0。
思路
思路一:
在Python中,利用切片功能可以对list或tuple(string也可以看作是一种list)进行翻转,利用这一特点,对数字进行反转,由于该数字为有符号数字,首先将其转换为字符串,只对数字部分进行反转。
Python切片小知识:
取一个list或tuple的部分元素,如:
L=[‘Michael’,‘Sarah’,‘Tracy’,‘Bob’,‘Jack’]
取前三个元素:
笨办法:
L[0],L[1],L[2]
[‘Michael’,‘Sarah’,‘Tracy’]
之所以称之为笨办法,是因为扩展一下,取前N个元素就没辙了。
取前N个元素,也就是索引为0-(N-1)的元素,可以用循环:
r=[]
n=3
for i in range(n):
r.append(L[i])
r
对于这种经常取指定索引范围的操作,用循环十分繁琐,因此,Python提供了切片(Slice),能大大简化这种操作。
对于上面的问题,取前3个元素:
L[0:3]
['Michael','Sarah','Tracy']
L[0:3]表示,从索引0开始取,直到索引3为止,但不包括索引3,即索引为0,1,2,正好3个元素。
如果第一个索引是0,还可以省略:
L[:3]
也可以从索引1开始,取两个元素出来:
L[1:3]
['Sarah','Tracy']
同样的,Python也支持从最后一个元素L[-1]的索引,即倒数第一元素的索引是L[-1]。那么他同样支持倒数切片。
L[-2:]
['Bob','Jack']
L[-2:-1]
['Bob']
另外,切片还可以每隔几个数取数:
例子:
我们首先穿件一个0-99的数列:
L=list(range(100))
L
[0,1,2,....,99]
取出前10个数:
L[:10]
[0,1,2,3,4,5,6,7,8,9]
后10个数:
L[-10:]
[90,91,92,93,94,95,96,97,98,99]
前11-20个数:
L[10:20]
[11,12,13,14,15,16,17,18,19]
前10个数,每两个一个:
L[:10:2]
[0,2,4,6,8]
所有数,每5个取一个:
L[::5]
[0,5,10,15,20,25,30,35,40,45,50,55,60,65,70,75,80,85,90,95]
甚至什么都不写,只写[:]就可以原样复制一个list:
L[:]
[0,1,2,.......99]
那么,同理,每隔-1个数取一个数,便是将该list反转。
.
.
关于题目思路:
接来开始讲我们这个题目的思路,就很简单了:
分析题目,将一个有符号数字进行反转,因此要考虑到符号位,只对数字部分进行反转,符号位不变。因此,将数字先转换成字符串,判断第一位 是否为负号。若不是,则直接利用切片对其进行反转;若是,将第一位保存,只对后面部分进行反转,反转后在加上负号即可。
另外,题目中提醒我们,记得判断下反转后的数的范围,是不是在[-2^31 ,2^31-1] 范围内,所以,记得判断一下哦。
附上该思路的代码:
class Solution:
def reverse(self,x):
''''
:type x:int
:rtype: int
''''
x=str(x) #首先,将数字转换为字符串
if x[0]=='-': #若x<0,则只取后面数字部分进行操作
x=x[1:]
x_new=x[::-1] #利用切片进行反转
y='-'+x_new
else:
y=x[::-1]
y=int(y)
if y<-2^31 or y>-2^31-1
return 0
else:
return y
思路二:
按照常规思路,类似于栈的思想,先将该数除10取余得到的数,入栈,
得到的商接着除10取余得到的余数,入栈,直到商为0。
但是这里要注意溢出问题,数值范围为[-231,231-1],如果反转后的数超过该范围,则返回0。
//pop operation
pop=x%10;
x=x/10
//push operation:
temp=rev*10+pop
rev=temp
若反转的数溢出,假设这里为正数,即temp=rev*10+pop>Max,那么
rev>=Max/10
附上代码如下:
class Solution:
def reverse(self,x):
"""
: type x: int
: rtype: int
"""
Max=pow(2,31) #Python的pow() 方法返回x的y次方 的值
temp=abs(x) #这里对x先取绝对值,将其变为正数后再进行取余运算,因为Python里负数的取余与C里不一样,比较复杂,昨晚上在这里吃了很大的亏。。。具体不作详述,下次重新整理一篇关于Python负数取余的笔记
while (temp!=0):
pop=temp%10
temp=temp//10 #python里‘/’号表示精确除法,比如:956/100=9.56 '//'号表示取整数,返回商的整数部分(向下取整),比如:956//100=9
iif rev>(Max-1)//10 or (rev==Max//10 and pop>7):
return 0
if rev<-Max//10 or (rev==-Max//10 and pop<-8):
return 0
rev=rev*10+pop
if x<0:
rev=-rev
return rev