7. 整数反转

7. 整数反转

题目描述

给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转。

注意:

  • 假设我们的环境只能存储得下 32 位的有符号整数,则其数值范围为 [ − 2 31 , 2 31 − 1 ] [−2^{31}, 2^{31} − 1] [231,2311]。请根据这个假设,如果反转后整数溢出那么就返回 0。
示例1
输入:x = 123
输出:321
示例2
输入:x = -123
输出:-321
示例3
输入:x = 120
输出:21
示例4
输入:x = 0
输出:0
提示:
  • − 2 31 ≤ x ≤ 2 31 − 1 -2^{31} \le x \le 2^{31} - 1 231x2311

题解:
法一:

使用 long long 类型中间变量保存数字的逆序结果,然后和 INT_MIN 和 INT_MAX 比较大小即可。

在 C++ 中,负数对正数取模后的结果仍是负数,比如 − 128 % 10 = − 8 -128 \% 10=-8 128%10=8 ,于是我们可以不用处理负数了。

法一代码:

class Solution {
public:
    int reverse(int x) {
        long ret = 0;
        while ( x ) {
            ret = ret * 10 + x % 10;
            x /= 10;
        }
        if ( ret < INT_MIN || ret > INT_MAX ) ret = 0;
        return ret;
    }
};
/*
时间:0ms,击败:100.00%
内存:6.2MB,击败:54.12%
*/
法二:

按照题意,不使用 long long 类型中间变量,可以使用数学方法解决:

  • 若是正数溢出,肯定是 r ∗ 10 + x % 10 > I N T _ M A X r*10 + x \% 10 > INT\_MAX r10+x%10>INT_MAX,化简一下可得: r > ( I N T _ M A X − x % 10 ) / 10 r > (INT\_MAX - x \% 10) / 10 r>(INT_MAXx%10)/10
  • 若是负数溢出,肯定是 r ∗ 10 + x % 10 < I N T _ M I N r*10 + x \% 10 < INT\_MIN r10+x%10<INT_MIN,化简一下可得: r < ( I N T _ M I N − x % 10 ) / 10 r < (INT\_MIN - x \% 10) / 10 r<(INT_MINx%10)/10

法二代码:

class Solution {
public:
    int reverse(int x) {
        int ret = 0, t;
        while ( x ) {
            t = x % 10;
            if ( x > 0 && ret > (INT_MAX - t) / 10 ) return 0;
            if ( x < 0 && ret < (INT_MIN - t) / 10 ) return 0;
            ret = ret * 10 + t;
            x /= 10;
        }
        return ret;
    }
};
/*
时间:4ms,击败:52.99%
内存:6MB,击败:85.01%
*/
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值