[Leecode] 7. 整数反转

[Leecode] 7. 整数反转

[LeetCode] 每日一题汇总

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

示例 1:

输入: 123
输出: 321

示例 2:

输入: -123
输出: -321

示例 3:

输入: 120
输出: 21

注意:

假设我们的环境只能存储得下 32 位的有符号整数,则其数值范围为 [−231, 231−1]。请根据这个假设,如果反转后整数溢出那么就返回 0。

解题1(PHP)

执行用时内存消耗
8 ms15 MB
class Solution {
    function reverse($x) {
        $negative = $x<0?true:false;
        $symbol = $negative?"-":"";
        $abs = $negative?abs($x):$x;
        $strval = strval($abs);
        $strrev = strrev($strval);
        if( $strrev < pow(2,31) ){
            $intval = intval($symbol . $strrev);
            return $intval;
        } else {
            return 0;
        }
    }
}

解题2(Cpp)

执行用时内存消耗
4 ms8.1 MB
81.15%89.58%

解题思路:https://leetcode-cn.com/problems/reverse-integer/solution/zheng-shu-fan-zhuan-by-leetcode/
当x为正数时:

  • 如果 temp = rev ⋅ 10 + pop \text{rev}\cdot 10 + \text{pop} rev10+pop 导致溢出,那么一定有 rev ≥ I N T _ M A X 10 \text{rev} \geq \frac{INT\_MAX}{10} rev10INT_MAX
  • 如果 rev > I N T _ M A X 10 \text{rev} > \frac{INT\_MAX}{10} rev>10INT_MAX,那么 t e m p = rev ⋅ 10 + pop temp = \text{rev} \cdot 10 + \text{pop} temp=rev10+pop一定会溢出
  • 如果 rev = = I N T _ M A X 10 \text{rev} == \frac{INT\_MAX}{10} rev==10INT_MAX,那么只要 pop > 7 \text{pop} > 7 pop>7 t e m p = rev ⋅ 10 + pop temp = \text{rev} \cdot 10 + \text{pop} temp=rev10+pop 就会溢出
  • 其中7为 I N I _ M A X % 10 INI\_MAX \% 10 INI_MAX%10
class Solution {
public:
    int reverse(int x) {
        int r = 0;
        int INT_MAX_10 = INT_MAX/10;
        int INT_MIN_10 = INT_MIN/10;
        int INT_MAX_LIMIT = INT_MAX%10;
        int INT_MIN_LIMIT = INT_MIN%10;
        while( x!=0 ){
            int p = x % 10;
            x /= 10;
            if( r>INT_MAX_10 || ( r==INT_MAX_10 && p>INT_MAX_LIMIT ) ) return 0;
            if( r<INT_MIN_10 || ( r==INT_MIN_10 && p<INT_MIN_LIMIT ) ) return 0;
            r = r*10 + p;
        }
        return r;
    }
};

错误示例1

这里是错误是当x为-2147483648时,x *= -1会溢出

class Solution {
public:
    int reverse(int x) {
        int temp = 0;
        bool negative = x<0?true:false;
        int HeadNum;
        if( negative ){
            x *= -1;
            HeadNum = INT_MIN % 10 * -1;
        } else {
            HeadNum = INT_MAX % 10;
        }
        while( x>0 ){
            int p = x % 10;
            if( (negative && (temp < INT_MIN/10 || (temp == INT_MIN/10 && p<HeadNum))) ||
                (!negative && (temp > INT_MAX/10 || (temp == INT_MAX/10 && p>HeadNum))) )
                return 0;
            temp = temp * 10 + p;
            x /= 10;
        }
        if( negative ) 
            temp *= -1;
        return temp;
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值