leetcode——7. Reverse Integer(java)

Given a 32-bit signed integer, reverse digits of an integer.

Example 1:

Input: 123
Output: 321

Example 2:

Input: -123
Output: -321

Example 3:

Input: 120
Output: 21

Note:
Assume we are dealing with an environment which could only store integers within the 32-bit signed integer range: [−231,  231 − 1]. For the purpose of this problem, assume that your function returns 0 when the reversed integer overflows.

这道题的主要就是将一个int类型的数字调整数字顺序倒序输出,但符号不变。这道题其实思想很简单,但是有一点要注意,反向输出时要注意是否超过了int范围,如果超过int类型的范围,则输出0。要考虑整型的溢出问题。java中,当int类型溢出以后,Java做的操作就是直接截断,保留后面32位,但不会抛出异常。

第一次ac是  直接用了一个栈 保存每一位的数,并计算这个数的总位数,然后从栈中取出这些数进行运算。至于对判断是否溢出的问题,是保存为Long型,如果结果和Long.intValue()不相等,则溢出,此时输出0。这样做虽然可以ac,但因为应用了栈并进行了两次循环操作,导致用时比较长。代码就不贴出来了,比较简单。

第二次ac舍弃了用栈作为临时存储单元,直接对取出的位数进行操作。

class Solution {
    public int reverse(int x) {
        Integer xx = Math.abs(x);
		int length  = xx.toString().length();
		Long ans =(long) 0;
		for(int i=length;i>0;i--){
			ans =  (long) (ans + (long) x%10 *Math.pow(10, i-1));
			x = x/10;
		}
		if(ans != ans.intValue()){
			return 0;
		}
		return ans.intValue();       
    }
}

后来在网上看到了别人的ac代码,发现有另一种判断int类型变量是否溢出的方法。

第一种是使用long型存储,每次遍历过程种判断是否已经超出了Int的存储范围,如果超过,则返回0

class Solution {
    public int reverse(int x) {
        long res = 0;
        while ( x != 0) {
            int l = x %10;
            res = res * 10 + l;
            if (res >= Integer.MAX_VALUE  || res <= Integer.MIN_VALUE) return 0;     
            x /= 10;
        }
        return (int) res;
    }
}

还有一种是在遍历过程中进行如下判断,当此时的结果大于Integer.MAX_VALUE/10时,下一位肯定会大于1,所以一定会溢出,或者rev == Integer.MAX_VALUE / 10 && pop > 7 (最大值的最后个位数是7,大于7肯定溢出)当此时恰好等于最大值下一位大于7时,一定会溢出,同理小于也是这样。

2^31 – 1 = 0111 1111 1111 1111 1111 1111 1111 1111 = 2147483647

2^31      = 2^31 – 1 + 1 = 1000 0000 0000 0000 0000 0000 0000 0000 = -2147483648

 

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;
    }
}

 

点赞