[LeetCode][Java] Reverse Integer

题目:

Reverse digits of an integer.

Example1: x = 123, return 321
Example2: x = -123, return -321

题意:

   题意很好理解,就是翻转一个整数。但是需要注意到溢出的情况,题目中假设的是32位的整数,翻转会有溢出的情况,溢出时直接返回0.


算法分析:

  这里我将整数分为正负两种情况处理,先将整数转化为字符串,之后将字符串翻转,判断字符串是否溢出,若不溢出,将该字符串重新转化为翻转后的整数。

  代码稍长,主要是这里引入了一个判断字符串是否满足转化为整数条件的检验函数,这个函数具有普适性。


代码如下:

public class Solution 
{
	private  int i;
	private  int labelnum;
	private  long finalnum;
	private  int finalnnum;
	private  int checkresult;
	private  int label;

    public  int reverse(int x) 
    {
    	String s1=Integer.toString(x);
    	if(s1.charAt(0)=='-')
    	{
    		String s2="-";
    		String finals2="-";
    		String Judges2="";
    		long num1=0L;
    		for(i=s1.length()-1;i>=1;i--) s2+=s1.charAt(i);
    		for(i=1;i<s2.length();i++)
    		{
    			if(s2.charAt(i)!='0') 
    			{
    				labelnum=i;
    				break;
    			}
    		}
    		for(i=labelnum;i<s2.length();i++) 
    		{
    			finals2+=s2.charAt(i);
    		}
    		label=checkstring(finals2);//检查是否存在溢出问题,label=1表明没有溢出;label=0表明产生溢出
    		if(label==1)
    		{
    			finalnum=Integer.parseInt(finals2);
    		}
    		else
    		{
    			finalnum=0;
    		}
    	}
    	else
    	{
    		String s2="";
    		String finals2="";
    		String Judges2="";
    		long num1=0L;
    		for(i=s1.length()-1;i>=0;i--) s2+=s1.charAt(i);
    		for(i=0;i<s2.length();i++)
    		{
    			if(s2.charAt(i)!='0') 
    			{
    				labelnum=i;
    				break;
    			}
    		}
    		for(i=labelnum;i<s2.length();i++)
    		{
    			finals2+=s2.charAt(i);
    		}	
    		label=checkstring(finals2);//检查是否存在溢出问题,label=1表明没有溢出;label=0表明产生溢出
    		if(label==1)
    		{
    			finalnum=Integer.parseInt(finals2);
    		}
    		else{
    			finalnum=0;
    		}
    		
    	}
    	
		return (int) finalnum;
    }
  
    private  int checkstring(String string) 
    {
        checkresult=1;
    	/* 异常情况1:字符串为null */
        if (string == null) checkresult=0;  
        int length = string.length(), offset = 0;
        /* 异常情况2:字符串长度为0 */
        if (length == 0)  checkresult=0; 
        boolean negative = string.charAt(offset) == '-';
        /* 异常情况3:字符串为'-' */
        if (negative && ++offset == length)  checkresult=0; 
        int result = 0;
    	char[] temp = string.toCharArray();
        while (offset < length) 
        {
          char digit = temp[offset++];
          if (digit <= '9' && digit >= '0') 
          {
            int currentDigit = digit - '0';
            /*
             * 异常情况4:已经等于Integer.MAX_VALUE / 10,判断要添加的最后一位的情况:
             * 如果是负数的话,最后一位最大是8 如果是正数的话最后一位最大是7
             * Int 范围:四个字节,-2147483648~2147483647
             */
            if (result == Integer.MAX_VALUE / 10) 
            {
	              if ((negative == false && currentDigit > 7)
	                  || (negative && currentDigit > 8)) 
	              {
	            	  checkresult=0; 
	              }
	              /*
	               * 异常情况5:已经大于Integer.MAX_VALUE / 10
	               * 无论最后一位是什么都会超过Integer.MAX_VALUE
	               */
	            } 
	            else if (result > Integer.MAX_VALUE / 10)
	            {
	            	checkresult=0; 
	            }	
             int next = result * 10 + currentDigit;
             result = next;
           }
        }
		return checkresult;
      }   
}

别人家的代码:

/**
 *  该题是将给定的整数进行逆序输出,可以通过对10进行取余而得到其个位,十位,百位等。
    但是需要注意以下问题:
    
    1.对于负数的逆序,只需要对其正数进行翻转,然后添加符号即可。
    2.逆转之后可能会产生比原数更大的数,从而造成整数的溢出。
    
    You can try this : x = -2147483648 as parameter. 此时-x已经溢出
    There has an easy way to solve the problem. Convert x to long, and check if the result >= Integer.MAX_VALUE, otherwise return 0.
*/
public class Solution 
{
    public int reverse(int x) 
    {
        long k = x;
        boolean isNegtive = false;        
        if(k < 0)
        {
            k = 0 - k;
            isNegtive = true;
        }

        long result = 0;
        while(k != 0)
        {
            result *= 10;
            result += k % 10;
            k /= 10;
        }

        if(result > Integer.MAX_VALUE) return 0;
        return isNegtive  ? 0 - ((int)result) : (int)result;
    }
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值