zoukankan      html  css  js  c++  java
  • Leetcode之整数反转

    问题描述

    给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转。

    示例 1:

    输入: 123
    输出: 321

    示例 2:

    输入: -123
    输出: -321

    示例 3:

    输入: 120
    输出: 21

    (color{#FF0000}{注意:假设我们的环境只能存储得下 32 位的有符号整数,则其数值范围为 [−231, 231 − 1]。请根据这个假设,如果反转后整数溢出那么就返回 0.})

    解法

    class Solution {
        public int reverse(int x) {
            if(x==0)
            return 0;
        //模10
        while(x%10==0)
    		x/=10;
        return get(x);
        }
        public int get(int a) {
    		String str=a+"";
    		StringBuilder sb=new StringBuilder();
                    //负数
    		if(str.charAt(0)=='-')
    			{
    			sb.append("-");
    				for(int i=str.length()-1;i>0;i--) {
    					sb.append(str.charAt(i));
    				}
    			}
    		else {//正数
    			for(int i=str.length()-1;i>=0;i--) {
    				sb.append(str.charAt(i));
    			}
    		}
    		try{
    			Integer.parseInt(sb.toString());
    		}catch(java.lang.NumberFormatException e) {//如果溢出
    			return 0;
    		}
    		return Integer.parseInt(sb.toString());
    	}
    }
    

    出现的问题

    • 在模10的情况前没有考虑特殊情况0
    • 刚开始时不知道怎么处理溢出,后来想到处理异常的方式处理溢出(当字符串转为int不合法时会抛出异常)

    结果

    官方解法

    class Solution {
        public int reverse(int x) {
            int rev = 0;
            while (x != 0) {
                int pop = x % 10;
                x /= 10;
                if (rev > Integer.MAX_VALUE/10 || (rev == Integer.MAX_VALUE / 10 && pop > 7)) return 0;
                if (rev < Integer.MIN_VALUE/10 || (rev == Integer.MIN_VALUE / 10 && pop < -8)) return 0;
                rev = rev * 10 + pop;
            }
            return rev;
        }
    }
    

    优秀解法

    public int reverse(int x) {
    	int ans = 0;
    	while (x != 0) {
    		if ((ans * 10) / 10 != ans) {//使用这种方法来判断ans*10是否会溢出
    			ans = 0;
    			break;
    		}
    		ans = ans * 10 + x % 10;
    		x = x / 10;
    	}
    	return ans;
    }
    

    有问题是ans*10可能没有溢出但是在ans = ans * 10 + x % 10如果溢出则结果是错的。这里可以通过的原因是2147483647和-2147483648可以看到当溢出时,最后一位一定是1或2不会达个位7、8这样的溢出条件。同理,官方解法中也不用判断7、-8的大小。

  • 相关阅读:
    MySQL索引优化入门
    优雅实现订单关闭及定时器的使用
    web.xml详解
    多个Tomcat之间实现Session共享
    tomcat8.0 基本参数调优配置
    tomcat部署会碰到的问题
    Centos7以上的版本 mysql 无法启动,无法停止问题
    tomcat 重启报错unregister mbean error javax.management.InstanceNotFoundException
    日线做多,15min做空的情况收集
    葛兰碧均线法则
  • 原文地址:https://www.cnblogs.com/code-fun/p/13634143.html
Copyright © 2011-2022 走看看