整数反转

简介: 整数反转

背景

给你一个 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为示例,通过以下图解来分析该反转算法的过程:

912c67db70fa43b1b16ab025d76879dd_tplv-k3u1fbpfcp-zoom-in-crop-mark_4536_0_0_0.png

第一步:我们先对123求余得到3,因为是第一次求余,所以我们的result初始化还是0,最终得到的result结果是result = result*10+3result表示的是上一次的结果,这次求余后我们的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的负数相关操作,和我们平时使用的其他语言是有明显区别的。


相关文章
|
7月前
|
存储 Python
leetcode-7:整数反转
leetcode-7:整数反转
38 1
|
存储 算法
LeetCode7-整数反转
LeetCode7-整数反转
|
2月前
|
存储
LeetCode整数反转
解决LeetCode上的整数反转问题的几种方法,包括错误的方法和优化后的解决方案,以及如何避免反转后的整数超出32位有符号整数范围的问题。
44 1
|
1月前
|
存储 Java
整数反转
题目要求将32位有符号整数的每一位数字反转,并考虑溢出情况。提供了两种Java实现:一种通过字符串操作实现,另一种使用数学运算,后者更为高效且简洁。两种方法均在检测到溢出时返回0。
30 0
|
2月前
|
Python
07_整数反转2021-04-18
07_整数反转2021-04-18
13 0
|
4月前
|
算法
LeetCode第7题整数反转
该文章介绍了 LeetCode 第 7 题整数反转的解法,通过除 10 取模和乘 10 累加的方式实现整数反转,同时注意边界情况的判断,并总结了通过举例推算发现规律的解题思路。
LeetCode第7题整数反转
|
6月前
7.整数反转
7.整数反转
|
7月前
|
存储 C++
整数反转(C++)
整数反转(C++)
44 0
|
存储 算法 安全
LeetCode - #7 反转整数
不积跬步,无以至千里;不积小流,无以成江海,Swift社区 伴你前行。如果大家有建议和意见欢迎在文末留言,我们会尽力满足大家的需求。
|
存储
整数反转1
整数反转1
72 0