整数反转
题目描述:
解题思路:
第一种:算是暴力法把,也没有什么过多的花里胡哨,这个题目的思路非常明确,也很简单,就是把数字反转,带负号的要保留,如果反转后开头数字是0
则要去除。根据这些所需条件,就很容易能写出代码。 对于反转整数,这里我第一想到了用字符串的方法,将这个数字转成字符串的形式,然后取绝对值将符号去掉(方便反转),用字符串切片的方法,也就是num[::-1]
,来将字符串反转,从而达到目的。然后,最后要注意最大数字范围,这个在LeetCode题目有提醒到,就是反转后的数字一定要在[-2**31, 2**31 - 1]
这个范围内,否则就是溢出,要返回0
。 这里分享字符串反转 的方法。 时间复杂度:O(logx )
class Solution :
def reverse ( self, x: int ) - > int :
number = str ( abs ( x) )
num = self. reverse_number( number)
if - 2 ** 31 <= num <= 2 ** 31 - 1 :
if x < 0 :
return int ( num) * ( - 1 )
else :
return int ( num)
else :
return 0
def reverse_number ( self, num) :
res_num = num[ : : - 1 ]
for i in range ( len ( res_num) ) :
if res_num[ i] == 0 :
res_num = res_num[ 1 : ]
else :
break
return int ( res_num)
第二种:直接整数反转。这个方法是对第一个方法的优化,因为第一个方法是将整数转换成字符串后反转,这里我们思考如何直接将数字反转,这里就要用到我们数学方面的知识了。通过一系列取余,整除等等,我们可以整数中的数字从后往前依次取出,那么如何使它出现在整数头部呢,这里我们每次取出就乘10
,然后补充下一位,赋给新定义的number
,遍历结束我们就成功得到反转的整数啦。然后得到反转整数之后的那些操作就和第一种一样了,判断范围这些。这个方法的速度就会明显比第一种要快一点。 时间复杂度:O(N )
class Solution :
def reverse ( self, x: int ) - > int :
plus = abs ( x)
number = 0
while plus:
temp = plus % 10
number = number* 10 + temp
plus = plus// 10
if - 2 ** 31 <= number <= 2 ** 31 - 1 :
if x > 0 :
return number
elif x == 0 :
return 0
else :
return - number
else :
return 0