LeetCode破解之整数反转

209 阅读2分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第18天,点击查看活动详情

题目描述

给你一个 32 位的有符号整数 x ,返回将 x 中的数字部分反转后的结果。

如果反转后整数超过 32 位的有符号整数的范围 [−231, 231 − 1] ,就返回 0。

假设环境不允许存储 64 位整数(有符号或无符号)。

示例 1:

输入:x = 123 输出:321

示例 2:

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

解题思路

  1. 先去判断x是否等于0.
  2. 判断是否超过范围,如果反转后整数超过 32 位的有符号整数的范围 [−231, 231 − 1] ,直接返回0;否则执行代码。
  3. 真的要好好思考,好好锻炼。

注意:不能存储64位整数。将整数最大值和最小值num分为两部分 num/10num%10,在数据组合之前判断是否越界。细节上,主要考虑如何将数字的每一位分离出来,循环求n%10可以将整数n的每一位分离出来,最开始得到的是n的个位数,也就是需要求解的最高位,在循环里面 * 10这样就可以得到所求的数字了

class Solution {
    public int reverse(int x) {
        int reverse = 0;
        while(x != 0) {
            if((reverse * 10) / 10 != reverse) {
                reverse = 0;
                break;
            }
            reverse = reverse * 10 + x % 10;
            x /= 10;
        }
        return reverse;
    }
}

使用工具类
  1. 先把int入参转化为绝对值

  2. 再转为字符串

  3. 字符串再转long

  4. 判断范围 是不是超过int 最大值

  5. 根据入参正负,返回对应的正负

注意:核心是如何避免数字越界,最简单的方法就是在他最接近越界的时候进行判断控制。初始给的就超过了最大值,这个我们可以直接进行判断,返回0就可以了,这个判断最简单(有一个数据就是这个,太恶心。),

class Solution {
    public int reverse(int x) {
        if (x == Integer.MIN_VALUE) return 0;
        Long strReverse = Long.parseLong(strReverse(String.valueOf(Math.abs(x))));
        if (strReverse > Integer.MAX_VALUE) return 0;
        return (int) (x >= 0 ? strReverse : strReverse * (-1));
    }
    private static String strReverse(String str){
        char[] chars = str.toCharArray();
        int start = 0;
        int end = chars.length-1;
        while (start < end ){
            char temp = chars[start];
            chars[start] = chars[end];
            chars[end] = temp;
            start++;
            end--;
        }
        return String.valueOf(chars);
    }
}。