LeetCode ! 7. Reverse Integer

参考资料:《程序员代码面试指南》

7. Reverse Integer
Given a signed 32-bit integer x, return x with its digits reversed. If reversing x causes the value to go outside the signed 32-bit integer range [-231, 231 - 1], then return 0.

Assume the environment does not allow you to store 64-bit integers (signed or unsigned).

 

Example 1:

Input: x = 123
Output: 321
Example 2:

Input: x = -123
Output: -321
Example 3:

Input: x = 120
Output: 21

思路:不断地提取给定数的最后一位,然后将其从给定数中抹去,把提取出的结果加入到变量res,加入前记得检查是否超出限定范围。
还是老师写的简洁,而且连给定数是否会在系统最小的个位数发生溢出都考虑在内了。先附上老师写的代码。

package topinterviewquestions;

public class Problem_0007_ReverseInteger {

	public static int reverse(int x) {
		boolean neg = ((x >>> 31) & 1) == 1;// record sign of input , 把最高位(最左边的位)移到最低位(最右边的位)带符号右移
		x = neg ? x : -x;// 统一转成负数来处理,因为负数的取值范围较大, Amazing!
		int m = Integer.MIN_VALUE / 10;// 防止溢出 res 10*res
		int o = Integer.MIN_VALUE % 10;
		int res = 0;
		while (x != 0) {
			if (res < m || (res == m && x % 10 < o)) {
			// 两种溢出的情况,1.十位数及其以上发生溢出; 2.(在十位数及其以上刚好不溢出时)个位数发生溢出
				return 0;
			}
			res = res * 10 + x % 10;
			x /= 10;
		}
		// now, x==0, res is nega
		return neg ? res : Math.abs(res);
	}

}

下面是自己写的……只能说起码通过了。

class Solution {
    public int reverse(int x) {
        if(x==Integer.MIN_VALUE){
            return 0;
        }
        int a = x<0?-x:x;
        // a>=0
        StringBuilder s = new StringBuilder();
        while(a!=0){
            s.append(a%10);
            a=a/10;
        }
        // "00012"
        int res=0;
        // boolean flag = false;
        int i=0;
        for(;i<s.length();i++){
            if(s.charAt(i)!='0'){
                break;
            }
        }
        while(i<s.length()){
           
            if(res>Integer.MAX_VALUE/10){
                return 0;
            }
             res=10*res+s.charAt(i)-'0';
            i++;
        }
        return x<0?-res:res;
    }
}

你可能感兴趣的:(数据结构与算法,leetcode,java,算法)