给定一个 32 位有符号整数,将整数中的数字进行反转。
示例 1:
输入: 123 输出: 321
示例 2:
输入: -123 输出: -321
示例 3:
输入: 120 输出: 21
注意:
假设我们的环境只能存储 32 位有符号整数,其数值范围是 [−231, 231 − 1]。根据这个假设,如果反转后的整数溢出,则返回 0。
一开始完成的版本,尽管变量比较多,但自己觉得写的很清楚。
class Solution:
def reverse(self, x):
"""
:type x: int
:rtype: int
"""
s = str(x)
flag = 0 # 0是没有负号
if s[0] == '-': #有负号
temp_s = s[1:]
flag = 1
else: # 没有负号
temp_s = s
ttemp_s = temp_s[::-1]
sig = ttemp_s.find('0')
if sig != -1:
tttemp_s = ttemp_s[(sig+1):]
else:
tttemp_s = ttemp_s
if flag == 0:
new_s = tttemp_s
elif flag == 1:
new_s = '-' + tttemp_s
return int(new_s)
主要用到以下几个知识点:
1.列表(字符串)中冒号的用法
网上查到一句话不错:“解释s[i:j:k]
是,根据该“片第从i到j与第k步”。何时i
和j
缺席,整个序列是和s[::k]
意思是“每k个项目””。
2.找列表的某一个元素的下标
字符串.find()或者字符串.index(),是从正向找某元素
有人说index好,因为它找不到会报异常,而find会返回-1。返回-1不是挺好的嘛,判断一下不就得了……可能是自己水平太渣没领悟到异常精髓吧
第一次提交,报了输入‘0’的错……MD就是说输入本身是0,我却把0都去掉了。整体外围给加一个判断是否为0的if吧。
第二次提交,输入为一个比较大的数,反转以后超过范围了……
输出:
9646324351
预期:
0
所以再给结尾那加个判断好了。
第三次提交,输入为102,应该返回201,我只返回了1。原来是压根没注意数中间有0怎么办。改进一下中间判断find 0的语句
改
if sig != -1 :
为:
if sig != -1 and ttemp_s[0] == 0:
最终通过!可见细节是多么重要。先放自己的源码:
class Solution:
def reverse(self, x):
"""
:type x: int
:rtype: int
"""
if x == 0:
return 0
else:
s = str(x)
flag = 0 # 0是没有负号
if s[0] == '-': #有负号
temp_s = s[1:]
flag = 1
else: # 没有负号
temp_s = s
ttemp_s = temp_s[::-1]
sig = ttemp_s.find('0')
if sig != -1 and ttemp_s[0] == 0:
tttemp_s = ttemp_s[(sig+1):]
else:
tttemp_s = ttemp_s
if flag == 0:
new_s = tttemp_s
elif flag == 1:
new_s = '-' + tttemp_s
result = int(new_s)
if result > (2 ** 31 - 1) or result < -(2 ** 31):
return 0
else: return result
网上一个简单一些的写法如下:
class Solution:
def reverse(self, x):
"""
:type x: int
:rtype: int
"""
b = pow(2, 31)
if x < 0:
x = abs(x)
ans = -int(str(x)[::-1])
else:
ans = int(str(x)[::-1])
if ans >= (-b) and ans <= b-1:
return ans
else:
return 0
主要是直接用输入数字x进行比较。我是转为字符串判断负号又判断0。在leetcode平台试了一下,上边这种方法没有判断尾0,在int转为str后直接反转再转回int居然没有尾0的问题。get到了!