面试题:整数反转

题目

给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转。

示例 1:

输入: 123
输出: 321

 示例 2:

输入: -123
输出: -321

示例 3:

输入: 120
输出: 21

注意:

假设我们的环境只能存储得下 32 位的有符号整数,则其数值范围为 [−231,  231 − 1]。请根据这个假设,如果反转后整数溢出那么就返回 0。

解决方案

方法一 

思路:数字反转可以先将数字转换为字符串,然后倒着循环字符串拿到反转后的值。但是需要注意几个问题。首先,数值是负数的情况,需要处理“-”,另外就是可能反转后会出现溢出的现象。因此转成字符串后,先将字符串转为long,判断是否超过Integer.MAX_VALUE,溢出输出0,或者报异常。

代码:

public static int reverse(int x) {
        String s = String.valueOf(x);
        if(s.length() <= 1) {
            return x;
        }

        StringBuilder builder = new StringBuilder();
        int j = 0;
        char firstChar = s.charAt(0);
        if(firstChar == '-') {
            builder.append('-');
            j = 1;
        }


        for(int i = s.length() - 1; i >= j; i--) {
            builder.append(s.charAt(i));
        }

        long result = Long.valueOf(builder.toString());

        //如果翻转后的数字超过int类型范围,则返回0
        if(result > Integer.MAX_VALUE || result < Integer.MIN_VALUE) {
            return 0;
        }
        return (int) result;
    }

方法二 

思路:一个整数的个位数是多少,其实就是x%10,然后要获取十位数上面的值,则x=x/10,再去取x%10,拿到十位数的值。如果x是一个三位数,则反转后的状态是个位数*(位数-1)。设当前计算结果为ans,下一位为pop

代码:

public int reverse(int x) {
    int ans = 0;
    while (x != 0) {
        if ((ans * 10) / 10 != ans) {
            ans = 0;
            break;
        }
        ans = ans * 10 + x % 10;
        x = x / 10;
    }
    return ans;
}
原文地址:https://www.cnblogs.com/alimayun/p/12791871.html