LeetCode - [7] 整数反转|刷题打卡

176 阅读2分钟

题目描述:

原题地址

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

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

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

示例一

输入:x = 123
输出:321

示例二

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

示例三

输入:x = 120
输出:21

示例四

输入:x = 0
输出:0

提示

  • 231<=x<=2311-2^{31} <= x <= 2^{31} - 1

思路分析

转字符串

此方法...
嗯 ...
怎么说呢
大概是因为本菜没有一颗算法的心 哈哈哈

弹出和推入数字 & 溢出前进行检查

本方法名来自官方

首先我们要反转一个整数,只要我们能拿到这个整数的 末尾数字 就可以了。 以 12345 为例,先拿到 5,再拿到 4,之后是 321,我们按这样的顺序就可以反向拼接处一个数字了,也就能达到 反转 的效果。

怎么拿末尾数字呢?好办,用取模运算就可以了

怎么判断溢出呢?分两种

  1. 一个是大于整数最大值 MAX_VALUE
  2. 另一个是小于整数最小值 MIN_VALUE

假设当前计算结果为result,下一位为pop

  • 从result * 10 + pop > MAX_VALUE这个溢出条件来看
    当出现 result > MAX_VALUE / 10 且 还有pop需要添加 时,则一定溢出
    当出现 result == MAX_VALUE / 10 且 pop > 7 时,则一定溢出,7是2^31 - 1的个位数

  • 从result * 10 + pop < MIN_VALUE这个溢出条件来看
    当出现 result < MIN_VALUE / 10 且 还有pop需要添加 时,则一定溢出
    当出现 result == MIN_VALUE / 10 且 pop < -8 时,则一定溢出,8是-2^31的个位数

参考
图解 7. 整数反转
画解算法:7. 整数反转

复杂度分析

时间复杂度:O(log(x))O(\log(x)),x 中大约有 log10(x)log_{10}(x) 位数字。

空间复杂度:O(1)O(1)

AC代码

class Solution {
    fun reverse(x: Int): Int {
        var copy = x
        var result = 0
        while (copy != 0) {
            val pop = copy % 10
            if (result > Int.MAX_VALUE / 10 || (result == Int.MAX_VALUE / 10 && pop > Int.MAX_VALUE % 10)) {
                return 0
            }
            if (result < Int.MIN_VALUE / 10 || (result == Int.MIN_VALUE / 10 && pop < Int.MIN_VALUE % 10)) {
                return 0
            }
            result = result * 10 + pop
            copy = copy / 10
        }
        return result
    }
}

附上大佬另一个写法

class Solution {
    fun reverse(x: Int): Int {  
        var copy = x
        var result = 0
        while (copy != 0) {
            val last = copy % 10
            val temp = result * 10 + last
            if ((temp -last) /10 !=result) {
                return 0
            }
            result = temp
            copy = copy / 10
        }
        return result
    }
}

总结

好像这题也不存在什么暴力解法的,本题的正统思路应该还是走数学路线,通过计算,并注意 溢出 问题,应该就很好解决。 后来也看了不少答案,大多数差异就在判断溢出的条件上。

再接再厉。

本文正在参与「掘金 2021 春招闯关活动」, 点击查看 活动详情