2.整数反转


一、题目描述

给你一个 32 位的有符号整数 x ,返回将 x 中的数字部分反转后的结果。如果反转后整数超过 32 位的有符号整数的范围 [−231, 231 − 1] ,就返回 0。

假设环境不允许存储 64 位整数(有符号或无符号)。
在这里插入图片描述

二、解题思路

主要是在数学逻辑的分析,以123为例,反转之后是321,那321中的3怎么能得到呢?是不是可以想到取余操作;123%10=3,如果按照这个思路,中间的2我们可以这样12%10=2;那12又怎么来的?通过(123-3)/10,然后321中1通过(12-2)/10的看看几个步骤是不是练习起来了,其实这种想法很难看出来,除非数学功底很好或者对数字很敏感可以直接想到这样的方法,真的要去仔细分析一下。(文字看着有点生涩)步骤总结如下:

123%10=3

12%10=2 (这个12通过(123-3)/10就得到了)

1%10=1 (同理1也是这样(12-2)/10)

是不是感觉只要拿到末尾数就可以了呢?

三、代码编写步骤

第一步:题目中说了给你一个32位的有符号的整数,确定了整数范围是属于-231~231-1整型,转换成32位二进制的最大最小值就是范围,所以第一步要先判断x属于这个范围。

第二步:因为整型数据分为负整型和正整型,所以在做转换时先把数据统一转成正整形。

第三步:要开始进行操作判断了,实现上面分析的过程,代码讲解部分详细说。

四、代码演示

class Solution {
    public int reverse(int x) {
        if(x==Integer.MIN_VALUE){
            return 0;
        }
        int neg = x<0 ? -1 :1;
        x *= neg;
        int ret = 0;
        while(x>0){
            int pop = x % 10;  //得到余数
            x = (x-pop)/10;  //得到第二步中的被除数12
            ret = ret*10+pop;  //这个ret存储的就是反转之后的数
            if((ret-pop)%10 != 0){ //
                return 0;
            }
            ret = ret;
        }
        return ret*neg;
    }
}

第3行:先考虑最小整数的情况, Integer.MIN_VALUE返回整形最大值,32个比特位能存储的有符号的最大数值,用一个if判断,如果x等于最小整数,则返回0。

第6行:这里的条件表达就相当于为了将接下来计算的数据统一转化成正整数的前提操作,neg取值是当x是负整数时neg=-1,x是正整数时,neg=1.

第7行:根据第6 行neg判断后的值,如果x是负整数,那么乘以neg=-1后就是正整数,利于下面的计算。

第8行:这里定义一个整型变量ret=0。

第9行:由于第7行的条件,x都是大于0 的

第10行到17行:这里详细分析每一步的操作

第一轮:

​ 以123为例,取余操作pop= x%10 = 123%10 =3

​ x = (x-pop)/10 = (123-3)/10 = 12

​ ret = ret*10 + pop = 3 (得到反转之后的第一个数)

​ if这里返回不成立(因为0等于0,这里判断条件是对10取余不等于0才会执行)

​ ret = ret =3(存储这个反转之后的数)

第二轮:

​ x=12>0继续while循环

​ pop=x%10=12%10=2 (这里就得到反转之后的第二个数字了)

​ x = (x-pop)/10 = (12-2)/10 = 1

​ ret = ret*10 + pop = 32

​ if条件这里返回不成立

​ ret = ret =32

第三轮:

​ x=1>0继续while循环

​ pop=x%10=1%10=1

​ x = (x-pop)/10 = (1-1)/10 = 0

​ ret = ret10 + pop = 3210+1=321

​ if条件这里返回不成立

​ ret = ret =321

第18行:返回ret*neg=321
0

​ ret = ret10 + pop = 3210+1=321

​ if条件这里返回不成立

​ ret = ret =321

第18行:返回ret*neg=321

总结

这里主要是自己的理解和思路,不足之还望指教,自己通过代码的debug去一步步看会很清晰。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值