整数反转
题目:
给你一个 32 位的有符号整数 x ,返回将 x 中的数字部分反转后的结果。如果反转后整数超过 32 位的有符号整数的范围 [−231, 231 − 1] ,就返回 0。
思路分析:
1、反转:整数不可变不可迭代,无法操作。转化为str 用反向切片,或者列表的reverse()方法。但创建列表需要额外空间,故采用字符串的反向切片。
2、符号:单独用条件判断,不参与反转过程
def reverse(x): # x:int
if not x: # 0 返回0
return 0
str_x = str(x)
str_number = str_x.rstrip('0') # 整数不可变不可迭代,无法操作,转化为str
if str_x[0] == ('-' or '+'): # 有符号
result = int(str_x[0] + str_number[:0:-1])
else: # 无符号
result = int(str_number[::-1])
if not -pow(2, 31) <= result <= pow(2, 31) - 1: # 必须同时满足:在范围内+不是空(0)
return 0
return result
注意事项:
1、str_number = str_x.rstrip('0')
字符串的lstrip(), rstrip(), strip()方法,返回的使去除首尾指定字符后的副本,并没有修改原字符串。因此要用变量接一下。
类似的还有列表的sorted()方法,返回的也是副本,不修改原列表。(但列表的reverse()、sort()方法直接修改列表本身)
2、因为采用了rstrip(‘0’),如果输入为0,那么这里变为空字符穿,后续int()后为None。因此单独讨论。
3‘result = int(str_x[0] + str_number[:0:-1])
反向切片,左闭右开。第一个取不到。[:0:-1]
4、str_x = str(x)
我第一次写,没有将str(x)用变量存储,而是后面每需要一次,就用str()转化一次。
后来尝试用变量存储后,执行时间减少8ms。
启发:多次使用某个方法/函数等时,先用变量存储,节约资源。