LeetCode第7题——整数翻转(另附Python 切片(Slice)笔记)

题目

给出一个 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反转。
.
.
.
.
关于切片(Slice)的详细介绍参见廖大大的Python教程:
https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/001431756919644a792ee4ead724ef7afab3f7f771b04f5000

.
.
.
.
.
关于题目思路:
接来开始讲我们这个题目的思路,就很简单了:
分析题目,将一个有符号数字进行反转,因此要考虑到符号位,只对数字部分进行反转,符号位不变。因此,将数字先转换成字符串,判断第一位 是否为负号。若不是,则直接利用切片对其进行反转;若是,将第一位保存,只对后面部分进行反转,反转后在加上负号即可。
另外,题目中提醒我们,记得判断下反转后的数的范围,是不是在[-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	
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值