LeetCode刷题记录2------整数反转(简单)

题目描述:

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

示例 1:

输入:123
返回:321

示例 2:

输入:-123
输出:-321

示例 3:

输入:120
输出:21

注意:

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

思路:

一开始,我想着把整数变成字符串来处理,然后去反转字符串,但我在实现过程中发现这并不是个好办法。

  • 如果我们先不考虑溢出的问题,那么这个题目将变成一个简单的数学题,假设输入数为123456,可以使用123456%10方法得到末尾数6,然后做一次123456/10运算,把末尾数去掉得到余下位数12345,再故技重施依次得到5,4,3,2,1,再按这个顺序依次进行反转运算拼接,即可完成反转,并且这个方法对负数同样适用。

  • 现在我们考虑溢出的问题,就需要在每一次反转拼接后就做一次判断,是否已经溢出。
    若一个进行反转拼接的数已经大于214748364(9位数)则无需再进行取最后一位的拼接了,因为最大值为2147483647(10位数),无论最后一位拼接什么数都是溢出的,返回0即可,若此时判断的反转拼接数恰好为214748364则需要判断最后一位拼接数是否大于7若大于则溢出返回0,小于则拼接后返回。
    同理,若一个进行反转拼接的数小于-214748364(9位数)则无需再进行最后一位的拼接,因为最小值为-2147483648(10位数),无论最后拼接什么数都会溢出,返回0即可,若此时判断的数恰好为-214748364(9位数)则需要判断最后一位拼接数是否小于-8,若小于则溢出返回0,大于则拼接后返回。

代码实现

class Solution {
    public int reverse(int x) {
        int res = 0;
        while (x !=0 ){
            //取末尾数
            int unit = x%10;
            //判断是否大于最大值溢出
            if (res > 214748364 || (res == 214748364 && unit > 7))
                return 0;
            //判断是否小于最小值溢出
            if (res < -214748364 || (res == -214748364 && unit < -8))
                return 0;
            //反转拼接
            res = res*10 + unit;
            //去掉末尾位
            x /= 10;
        }
        return res;
    }
}
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。