leetcode之整数反转

leetcode Sep 10, 2019

题目描述

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

示例 1:

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

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

输入: 120
输出: 21
注意:

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

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/reverse-integer

题解

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

思路

每一位上取余,获取那一位上的位数,然后除10减一位。每次循环把获得余数和上一位的数字乘以10相加。
另外就是要判断是否溢出,会溢出的地方就是

reverse = reverse * 10 + x % 10;

所以我们判断

  1. 如果reverse大于INTMAX/10,那么reverse一定溢出
  2. 如果reverse==INTMAX/10,同时x % 10 > 7 一定会溢出,因为INTMAX是2147483647,最后一位是7。
    ps:负数类似。但是第二个条件其实不用判断因为整数反转的最后一位一定是1或者2不会大于7的。

总结

最近面试,碰到稍微难点的算法题就挂了。哎,出来混的,迟早要还的。大学没有好好学习算法,希望现在努力还不算太晚。