【刷题记录】7. 整数反转

237 阅读1分钟

Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情

一、题目描述

来源:力扣(LeetCode)

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

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

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

示例 1:

输入:x = 123

输出:321

示例 2:

输入:x = -123

输出:-321

示例 3:

输入:x = 120

输出:21

示例 4:

输入:x = 0

输出:0  

提示:

-231 <= x <= 231 - 1

二、思路分析

按照正常思路我们很容易想到

  • 每次对数字取余 n = x % 10 记得到当前位的数字
  • 反转后的数字为 res = res * 10 + n

此时即可得到反转后的数字,但是以为题目要求

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

  • 所有在每次进行下一位数数组的反转时,要判断res是否已经超出了题目的范围

三、代码实现

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

复杂度分析

  • 时间复杂度:O(logx))O(log |x|))。翻转的次数即 x 十进制的位数
  • 空间复杂度:O(1)O(1)

运行结果

image.png

总结

这个题目实现的思路来说,还是很容易想到的。 这道题目的重点是在于在于对反转后数组是否在题目规定范围内的处理。