学好算法很重要,然后要学好算法,大量的练习是必不可少的,LeetCode是我经常去的一个刷题网站,上面的题目非常详细,各个标签的题目都有,可以整体练习,本公众号后续会带大家做一做上面的算法题。

官方链接:https://leetcode-cn.com/problemset/all/

一、题意

难度:简单

https://leetcode-cn.com/problems/reverse-integer/

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

注意:


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

示例

输入:x = 123
输出:321

输入:x = -123
输出:-321
    
输入:x = 120
输出:21

输入:x = 0
输出:0


提示:

  • 231 <= x <= 231 - 1

二、解题

方法一:字符串转换

思路:

字符串转换获取是最容易想到的一个方法,先将该数值转换成字符串,再进行翻转即可。不过这里还需要考虑一步溢出的问题,所以需要捕获一下异常,使其直接返回 0。

代码:

class Solution {
     public int reverse(int x) {
        // 正负标记
        int flag;
        // 字符串
        StringBuilder sb = new StringBuilder();
        String s = "" + x;
        // 判断是否为负数
        if(x >= 0){
            flag = 1;
            sb.append(s);
        }else{
            // 截取 - 号后面的数值
            flag = -1;
            sb.append(s.substring(1));
        }
        // 翻转字符串
        sb.reverse();

        try{
            // 返回结果
            return flag * Integer.parseInt(sb.toString());
        }catch(Exception e){
            // 超过 Integer 上下限,直接返回 0
            return 0;
        }

    }
}

复杂度分析:

  • 时间复杂度:O(log(x))
  • 空间复杂度:O(log(x))

方法二:数学

思路:

通过循环将数字 x 的每一位拆开,从后往前进行累加,同时判断下一步是否溢出

溢出条件:

  • MAX_VALUE

    • 当前值 > Integer.MAX_VALUE / 10,且 x 不为零时则一定为溢出数值

    • 当前在 == Integer.MAX_VALUE / 10,且 x 大于 7 (Integer.MAX_VALUE 个位数为 7)时则一定溢出

  • MIN_VALUE

    • 当前值 < Integer.MIN_VALUE/ 10,且 x 不为零时则一定为溢出数值

    • 当前在 == Integer.MIN_VALUE / 10,且 x 小于 -8 (Integer.MIN_VALUE个位数为 8)时则一定溢出

LeetCode刷题笔记 - 7.整数反转_java

代码:

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

复杂度分析:

  • 时间复杂度:O(log(x))
  • 空间复杂度:O(1)