第7题:整数反转

解题思路

7. 整数反转

起始思路很笨拙:思路一
  • 把数值都变成正数处理,因为后续数据转换过程中如果存在负数符号会报错,但要用标志位标记一下负号再转换成正数
  • 利用StringBuffer特有的倒序方法对数值进行倒序处理,倒序后要把开头的0全部删除,然后比较倒序后的数据是否超出了int的表示范围,超出了就返回0
  • 然后就是把数值转换成int类型,然后通过标志位来判断是负数还是正数。
思路二:

我们只要能拿到这个整数的 末尾数字 就可以了:通过取模运算。
以12345为例,先拿到5,再拿到4,之后是3,2,1,我们按这样的顺序就可以反向拼接处一个数字了,也就能达到 反转 的效果。

代码

方法一
//运行时间:7ms  内存消耗37MB
class Solution {
    public static int reverse(int x) {
    	   long figure = x;
    	   if(x==0) return 0;
    	   boolean flag = false ;//正数
    	   double min = Math.pow(2, 31);
    	   double max = Math.pow(2, 31)-1;
    	   if(figure<0)  {  //遇到负数,标记一下,如何全变成正数处理
    		   flag =true;  //负数
    		   figure=-figure;   //-2147483648*-1 = -2147483648  最小值乘-1比最大值大1,即最大值+1 = 最小值
    	   }
    	   String sb1 = String.valueOf(figure);
    	   StringBuffer sb2 = new StringBuffer(sb1);
    	   sb2.reverse();
    	   for(int i=0;i<sb2.length();i++) {
    		   if(sb2.charAt(0)=='0') {
    			   sb2.deleteCharAt(0); //把开头连续的0全删掉
    		   }else {
    			    break;      //当开头不为0了就退出
    		   }
    	   }
    	   double curr_reverse_value = Double.parseDouble(sb2.toString());
    	   //如果反转后整数超过 32 位的有符号整数的范围 [−231,  231 − 1] ,就返回 0。
    	   if(flag==true && curr_reverse_value>min)  return 0;
    	   if(flag==false && curr_reverse_value>max)  return 0;
    	   if(flag==true) return -(int)curr_reverse_value;  //负号前面加-
           return (int)curr_reverse_value;
     }
}
方法二:
//运行时间:1ms  内存消耗35.6MB
class Solution {
    /*
      * 优化后:
      */
     public static int reverse(int x) {
    	 long result = 0;
    	 int tmp=0;
    	 double int_min = -Math.pow(2, 31);
    	 double int_max = Math.pow(2, 31)-1;
    	 while(x!=0) {
    		  tmp = x%10; //每次都取最后个数的数值
    		  result = result*10+tmp;
    		  x=x/10;
    		  if(result<(int)int_min || result>(int)int_max) return 0;
    	 }
    	 return (int)result;
     }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值