[Leetcode刷题] - LC007 Reverse Integer

该问题要求反转一个整数,如果反转结果超出Integer的范围则返回0。解决方案是逐位反转数字,同时检查是否会发生溢出。在反转过程中,当数字大于最大值的1/10或小于最小值的1/10时,或者在边界情况下(等于最大或最小值的1/10)下一位数字会引发溢出,都应返回0。代码中使用了一个while循环和辅助变量来实现这一逻辑。
摘要由CSDN通过智能技术生成

题目描述

将一个Int类型的数字进行反转,如果反转结果超出int的范围,返回0

Leetcode 007Can you solve this real interview question? - Level up your coding skills and quickly land a job. This is the best place to expand your knowledge and get prepared for your next interview.icon-default.png?t=N2N8https://leetcode.com/problems/reverse-integer/

题目思路

问题比较简单,唯一复杂的地方是如果判断超出Integer的范围,基本思路就是先从个位逐位提取,然后在逐位反转。对于判断反转时是否越界,首先我们要知道Int类型的范围是在[-2147483648, +2137483647] 也就是 [-2^{31}, 2^{31}-1],所以越位有两种情况:

  1. 在反转没结束前,当前数 > Integer.MAX_VALUE/10 或者 < Integer.MIN_VALUE/10
  2. 在反转没结束前,当前数 == Integer.MAX_VALUE/10 并且下一位数>7 或者 Integer.MIN_VALUE/10 并且下一位数<-8

代码如下:

class Solution {
    public int reverse(int x) {
        
        int digit = 0;
        int res = 0;

        while(x!=0) {
            // pop

            digit = x%10;
            x = x/10;

            // reverse

            if (res>Integer.MAX_VALUE/10 || res<Integer.MIN_VALUE/10) return 0;
            if (res==Integer.MAX_VALUE/10 && digit>7) return 0;
            if (res==Integer.MIN_VALUE/10 && digit<-8) return 0;
            res = res*10+digit;
        }

        return res;
        
    }
}

时间复杂度:O(L_{digits});空间复杂度:O(1)。 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值