翻转数

作者: 墨_0b54 | 来源:发表于2020-09-08 22:23 被阅读0次

翻转数

给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转。 
示例 1: 
输入: 123
输出: 321

示例 2: 
输入: -123
输出: -321

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

思路:本来想先转为字符串再翻转然后转为数字,但是查看Interger.toString(x)方法的源代码时,发现了一个stringSize(x)方法,可以得到整数x的长度L,然后L-1次循环得到x的最后一位数,并乘以10的L-1次方。如果长度大于等于9,需要判断是否溢出。

注意:

  • 需要用long存储相加结果,防止结果溢出。
  • 注意int最小值-2147483648直接转正数会溢出(最大值2147483647)。
class Solution {
    final int [] sizeTable = { 9, 99, 999, 9999, 99999, 999999, 9999999,
            99999999, 999999999, Integer.MAX_VALUE };
    //Integer的stringSize方法
    int stringSize(int x) {
        for (int i=0; ; i++){
            if (x <= sizeTable[i]){
                return i+1;
            }
        }
    }
    public int reverse(int x) {
        //如果是最小值,直接返回0
        if (x == Integer.MIN_VALUE){
            return 0;
        }
        //用来做负数标志
        boolean flag = false;
        //如果小于零先转为正数,并标记为负数
        if (x < 0){
            x=-x;
            flag = true;
        }
        //取x的长度
        int size = stringSize(x);
        long result = 0L;
        for (int i=size-1; i>=0; i--){
            //每次循环判断是否溢出,溢出直接返回0
            if (result > Integer.MAX_VALUE){
                return 0;
            }
            result += x%10 * Math.pow(10,i);
            x = x/10;
        }
        if (flag){
            result = -result;
        }
        return (int)result;
    }
}

我的仓库,欢迎监督:https://gitee.com/udonn_admin/every-day

相关文章

网友评论

      本文标题:翻转数

      本文链接:https://www.haomeiwen.com/subject/qafsektx.html