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监控全部执行过的sql语句
    Linux之网络编程:时间服务器
    人生哲理 |南怀瑾最经典的50句话
    TCP/IP协议(一)网络基础知识 网络七层协议
    Linux下进程通信之管道
    一个完整的项目管理流程
    Linux编程之select
    (笔记)电路设计(十四)之放大器的应用
    ds18b20采集温度并上报服务器
    java中基于swing库自定义分页组件
  • 原文地址:https://www.cnblogs.com/code-fun/p/13634143.html
Copyright © 2011-2022 走看看