给定整数(可正数可负数)32位有符号整数,反转整数部分,反转的结果可能是超出32位有符号整数部分,如果超出那么返回0.

而且要求中间不允许出现64位有符号整数存储。

  1. 第一种解法:

    采用整数转字符串,利用双指针反转字符串

public int reverse(int x) {
        boolean flag = false;
        long y = x;
        if(y < 0) {
            flag = true;
            y = - y;
        }
        char[] charArray = String.valueOf(y).toCharArray();
        int i = 0, j = charArray.length - 1;
        while (i < j) {
            char c = charArray[i];
            charArray[i] = charArray[j];
            charArray[j] = c;
            i ++; j --;
        }
        String s = new String(charArray);
        Long aLong = Long.parseLong(s);
        if (flag) aLong = - aLong;
        if(aLong > Integer.MAX_VALUE || aLong < Integer.MIN_VALUE) return 0;
        else return aLong.intValue();
    }

需要注意的问题:反转字符串后可能出现超出32位有符号数范围,因此再转数字需要long类型,不符合题意要求。

  1. 第二种解法:

利用取余法逆序取出每一位。

class Solution {
    public int reverse(int x) {
        long ans = 0;
        while (x != 0) {
            ans = ans * 10 + x % 10;
            if (ans > Integer.MAX_VALUE || ans < Integer.MIN_VALUE) {
                return 0;
            }
            x = x / 10;
        }
        
        return (int) ans;
        
    }
}
此解决方案:也用到了 long 类型。

3. 解决方式

同2一样思路,但用 int 类型存 ans,ans 可能存在溢出,当 x > 0 时, ans * 10 + x % 10 > Integer.MAX_VALUE 时溢出, 将条件作等价变换 ans > (Integer.MAX_VALUE - x % 10) / 10; 此等式不会发生溢出,但此等式成立,表示反转数字出现了溢出。同理,当 x < 0 时, ans * 10 + x % 10 < Integer.MIN_VALUE 溢出。
class Solution {
    public int reverse(int x) {
        int ans = 0;
        while (x != 0) {    
            if(x > 0 && ans > (Integer.MAX_VALUE - x % 10) / 10) return 0;
            if(x < 0 && ans < (Integer.MIN_VALUE - x % 10) / 10) return 0;
            ans = ans * 10 + x % 10;
            x = x / 10;
        }
        return ans;
    }
}