背景
给你一个 32 位的有符号整数 x ,返回将 x 中的数字部分反转后的结果。
如果反转后整数超过 32 位的有符号整数的范围 [−231−2^{31}−231,2312^{31}231 − 1] ,就返回 0。
假设环境不允许存储 64 位整数(有符号或无符号)。
示例 1:
输入:x = 123 输出:321 示例 2:
输入:x = -123 输出:-321 示例 3:
输入:x = 120 输出:21 示例 4:
输入:x = 0 输出:0
提示:
−231-2^{31}−231 <= x <= 2312^{31}231 - 1
感兴趣的小伙伴可以查看原题:leetcode.cn/problems/re…
分析
这个题目比较简单,整数的反转,一般会使用到整除和求余两个操作:
比如整数123,整除10,结果是12;对10求余结果是3;
所以我们可以使用求余得到整数的最后一位数字,通过整除将整数逐步分解;
下面我们以整数123为示例,通过以下图解来分析该反转算法的过程:
第一步:我们先对123
求余得到3
,因为是第一次求余,所以我们的result初始化还是0,最终得到的result结果是result = result*10+3
,result
表示的是上一次的结果,这次求余后我们的result=3
;
第二步:求余完成后,我们需要从整数
123
中把3
剔除掉,这个时候需要使用到整除的操作,123/10=12
,此时我们需要把整数值调整为12
并参与下一轮求余;第三步:我们重复第一步的操作对整数
12
求余得到2
,此时的result=3
,那么我们计算result = result*10+2
,最终result=32
;第四步:我们重复第二步的操作,针对整数
12
整除10
,把刚刚求余结果2
剔除掉,此时整数值调整为1
;第五步:继续重复第一步的操作,对整数
1
进行求余操作,得到余数1
;那么通过result=result*10+1
可得result=321
;第六步:我们还要继续对
1
进行剔除,此时整数值调整为0
,此时程序需要终止,那么最终我们得到的结果值就是反转后的整数值;
java代码
public int reverse(int x) { // 初始化结果值 int result = 0; // 如果整数值不为0 while(x!=0){ // 对整数值求余,获取个位数 int tail=x%10; // 先用一个临时结果接收 int tmpResult = result*10+tail; // 判断是否超过int类型范围 if((tmpResult-tail)/10!=result){ //超过九返回0 return 0; } // 没有超过才真正赋值给结果值 result = tmpResult; // 剔除个位数 x = x/10; } // 返回结果 return result; } 复制代码
【注意】一定要注意判断结果值是否超出类型范围;判断方法可以通过反向计算检查计算后的结果和原来的结果值是否一致,如果不一致,说明超出了类型范围,否则说明没有超过类型范围;
python代码
def reverse(x: int) -> int: # 定义最大值 MAX_VALUE = pow(2, 31) - 1 # 定义最小值 MIN_VALUE = -pow(2, 31) # 定义结果值 result = 0 # 如果整数值不为0 while x != 0: # 如果整数值大于0 if x > 0: # 求余 tail = x % 10 # 如果结果值下一次计算将会大于最大值,直接返回0;提前判断 if result > (MAX_VALUE - tail) / 10: return 0 # 计算结果值 result = result * 10 + tail # 剔除个位数 x = x // 10 # 如果整数值小于0 else: # 求余;需要注意的是,python中的负数求余和java是不一样的 tail = x % -10 # 如果结果值将会超出最小值范围,直接返回0 if result < (MIN_VALUE - tail) / 10: return 0 # 计算结果值 result = result * 10 + tail # 剔除个位数 x = -(x // -10) # 返回结果值 return result 复制代码
【注意】一定要注意python中的负数求余和整除,和我们想象中的不一样;
rust代码
pub fn reverse(x: i32) -> i32 { // 初始化结果值 let mut result = 0; // copy x的值到num上面,因为x不是mut修饰的 let mut num = x; // 如果整数值不为0 while num != 0 { // 求余获取个位数 let tail = num % 10; // 临时结果 let tmp_result = result * 10 + tail; // 判断是否超过类型范围,超出直接返回0 if (tmp_result - tail) / 10 != result { return 0; } // 没有超出才赋值给结果值 result = tmp_result; // 剔除个位数 num = num / 10; } // 返回结果值 return result; } 复制代码
我们针对该题使用了三种不同的编程语言给出题解;java和rust的题解差不多,需要特别注意python的负数相关操作,和我们平时使用的其他语言是有明显区别的。