这是简单难度的LeetCode习题,但总共用了两个多小时的时间才搞定。其中出了很多问题,并且觉得很典型,所以写博客以记录下来。
最终结果:
先说一下解题思路。这道题的关键就是考虑各种临界情况(特殊情况):
对于输入的函数,先判断是否溢出,如果溢出直接返回0,否则进行如下操作:
取此数的绝对值
从最后一位开始,判断当前位置是否为0
从不为0的第一个位置开始运算
获取每一位的数字:
在运算的时候依次除以10,100……抛去余数继续进行,直到商小于1
(或者除以10,在做完除法之后将原来的数缩小十倍)
以下为代码:
public class Solution {
public int reverse(int x) {
double result=0,meresult=Math.abs(x),shang=1,beishu=10,yushu=0;
if(Math.abs(meresult)>((int)Math.pow(2,31)-1))
return 0;
boolean ifZero=true;
while(shang>0){
yushu=meresult%beishu;//求余数
if(yushu!=0)
ifZero=false;
if(!ifZero){
if(Math.abs(result*10)>((int)Math.pow(2,31)-1))
return 0;
result=result*10+yushu;
}
meresult=(meresult-yushu)/beishu;
shang=meresult/beishu;//求商
}
if(x<0)
result=-result;
return (int)result;
}
}
思路也不难,但在真正实现的时候出了很多错误。
1.不注意有符号整数和无符号整数的区别,后改为用绝对值比较大小。
2.int和double的区别。int有32位,所以如果中间结果用int表示的话,一旦超出范围就会出现乱的数字,所以都尽量改为了用double。这个错误是一开始都没有注意到的到最后才挑出来。这是很关键的一点,因为如果要是直接把数据类型设置为int,一旦在反转过程中出现溢出问题,这个暂时的结果会变成很乱的一个数字,但绝对不是正确结果(这种情况其实只能在最后一步出现。另一种解决方案是在最后一步单独处理,分别将结果放在int和double型对象中比较是否相等,如果不相等就返回0)。
3.代码执行顺序。
meresult=(meresult-yushu)/beishu;
shang=meresult/beishu;//求商
这两句代码如果相反顺序执行会发生错误
最后还是感觉自己实现的优点啰嗦,可读性不是很高,但大体思路是没有问题的。
补充一些知识点:
0x7FFFFFFF是long int的最大值:以8位进制计数,相当于二进制中的0111 1111 1111 1111 1111 1111 1111 1111
用 INT_MAX 常量可以替代这个值。
0x80000000是int的最小值:此数值是用补码形式表示的
1.不注意有符号整数和无