Reverse Integer


这是简单难度的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.不注意有符号整数和无
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值