一、题目描述
给你一个 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去一步步看会很清晰。