提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
今天的题好简单
给你一个 32 位的有符号整数 x ,返回将 x 中的数字部分反转后的结果。
如果反转后整数超过 32 位的有符号整数的范围 [−231, 231 − 1] ,就返回 0。
假设环境不允许存储 64 位整数(有符号或无符号)。
示例 1:
输入:x = 123
输出:321
示例 2:
输入:x = -123
输出:-321
示例 3:
输入:x = 120
输出:21
示例 4:
输入:x = 0
输出:0
-231 <= x <= 231 - 1
没啥难度,输入后和输出前判断两次范围,中间无脑反转字符串就行了
需要注意python切片步长为-1时下标是从后往前算的,其中s【start,end,-1】中,切出[start,end)的序列(已反转),故end是小下标,start是大下标。
传统做法应该是数学方法,while循环取模求余依次得到从后往前的每一位(cur=x%10;x=x/10),
对于每一位把他加入结果result中(result=result*10+cur)
需要注意:
① INT_MAX = 2^31-1,INT_MIN= -2^31
②在形成结果的过程中不断判断范围,一旦出现上溢出或下溢出,立即返回0
本题假设环境不允许存储 64 位整数,因此输入不会有溢出,只能是在反转的过程中,在形成result中出现溢出。也就是result*10+num>INT_MAX
or result*10+num
上溢出条件:
下溢出条件:
③复杂度分析
log(x)相当于取x的位数,因为要遍历x的每一位
空间上只需要原地乘,O(1)
class Solution:
def reverse(self, x: int) -> int:
#计算上下边界
edge=pow(2,31)
down=-edge
up=edge-1
#如果在边界外,返回0
if(x<down or x>up):
return 0
#如果是负数,先将去掉符号的部分转为字符串然后反转然后转为int然后加上符号
if(x<0):
re=-(int(str(x)[:0:-1]))
#正数不用在意负号,直接反转即可
else:
re=int(str(x)[::-1])
#要保证输出的结果也在范围内
if(re<down or re>up):
return 0
else:
return re
class Solution {
public:
int reverse(int x) {
//结果
int result=0;
//当前数字
int cur = 0;
//遍历每一位
while(x != 0){
cur = x%10;
x/=10;
if(result>INT_MAX/10 || result == INT_MAX/10 && cur>INT_MAX%10){
return 0;
}
if(result<INT_MIN/10 || result == INT_MIN/10 && cur<INT_MIN%10){
return 0;
}
result = result*10 + cur;
}
return result;
}
};