声明
今天做了第2个简单题,这是狗生完整刷完的第2道LeetCode题,虽然借鉴了别人的思路,没有完整自己做出来,但是,啊!在此记录一下~
题目
给定一个 32 位有符号整数,将整数中的数字进行反转。
eg1.输入-输出:123 -> 321
eg2.输入-输出:-123 -> -321
eg3.输入-输出:120 -> 21
正文
主要思路是2种。第一种是拆解成字符串处理,第二种是将整数不断除10向下取整得到余数,再乘以10达到逆转整数的目的。以下解法1、2属于第一种,解法3、4属于第二种,文末附上了参考的其他博客链接,侵删哦。
解法1。先取绝对值再强制转换成string,再把string[::-1]逆序输出后强制转换为int得到结果,在根据该整数正负决定返回结果前要不要加负号。
# V 1.0 执行成功
class Solution:
def reverse(self, x):
x_string = str(abs(x))
if x < 2**31:
rev_x = int(x_string[::-1])
if x > 0:
return rev_x
else:
return -rev_x
解法2。根据整数正负分开处理,正数直接逆序输出后转换,负数取负号之后的数字逆序输出后转换并在结果上加负号,最后进行范围校验
# V 2.0 能提交
class Solution:
def reverse(self, x):
if -10 < x < 10: #个位数直接返回
return x
else:
str_x = str(x)
if str_x[0] != '-': # 如果是正数则直接逆序输出后转为int
str_x = str_x[::-1]
x = int(str_x)
else:
str_x = str_x[1:][::-1] # 如果是负数则取符号之后的数字逆序输出后转为int
x = int(str_x)
x = -x
return x if x > -2147483648 and x < 2147483648 else 0 # 范围校验
解法3。更像是两种方法的结合,一方面利用了字符串取最后1位的便利性,一方面又采用了整数取余重新计算逆序数的思路。先转换成字符串,计算其长度,根据第一个字符是否为‘-’判断正负进入不同判断分支,分支里的逻辑是先用一个for循环从字符串整数最后1位开始乘10,计算完进行范围校验,然后返回
# V 3.0 能提交
class Solution:
def reverse(self, x):
str_x = str(x)
x_len = len(str_x)
count = 0
if str_x[0] == '-':
for i in range(x_len-1):
count = count * 10 + int(str_x[-1-i]) # 取整数倒数第1+i位
if count < 2**31:
return -count
else:
return 0
else:
for i in range(x_len):
count = count * 10 + int(str_x[-1-i])
if count < 2**31-1:
return count
else:
return 0
解法4。纯数学处理,取余再除以10向下取整,这样可以逆序获取数字的各个位,再迭代乘以10就能计算出逆序数了
# V 4.0 能提交成功
class Solution:
def reverse(self, x):
flag = 1 if x >= 0 else -1 # 用flag记录整数正负
new_x = 0
abs_x = abs(x)
while abs_x:
new_x = new_x*10 + abs_x%10
abs_x //= 10 # 注意这里用的是取整除//而非/,不然就返回的是12.3(比如输入是123),正确返回结果应该是12
new_x = flag*new_x
return new_x if new_x < 2147483648 and new_x >= -2147483648 else 0
引用
解法1 & 解法4:https://blog.csdn.net/coder_orz/article/details/52039990#commentsedit
解法2:https://blog.csdn.net/chenhua1125/article/details/80464642
解法3:https://blog.csdn.net/xiaoxiaoley/article/details/78721071