LeetCode - 7 整数反转

题目来源

7. 整数反转 - 力扣(LeetCode)

题目描述

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

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

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

示例 1

输入:x = 123

输出:321

示例 2

输入:x = -123

输出:-321

示例 3

输入:x = 120

输出:21

示例 4

输入:x = 0

输出:0

提示

  • -2^31 <= x <= 2^31 - 1

题目解析

本题还是比较简单的,主要就是考察整数分解。

假设有整数 x,现在我们需要求解它各位上的数,那么我们只要不断进行如下两个操作即可:

  1. x % 10,求余10,那么余数就是最低位的数
  2. x = x / 10,整除10,那么商就是去掉最低位后的数

反复进行上面两步,即可将一个整数分解。

本题需要我们将整数反转,即低位变高位,其实也很简单,假设初始化 res = 0,那么:

  • res = res * 10 + x %10

按此逻辑,先分解出来的低位不停地 *10 提高位序,即可完成整数反转。

需要注意的是,本题的 x 虽然取值范围限制在了 int 范围内,但是 x 反转后的数值是可能超出 int 范围的,但是不会超出 long 范围,因此反转后的数 res 我们应该使用 long 来记录。

还有一点,本题暴露了python的一个问题,那就是 python 的 负数取余正数 比较奇葩,会产生意想不到的结果,python 同学需要注意一下,看下下面代码实现。

还有一点,写这题时,我们可能不会记得 int 范围最大值和最小值,因此可能会利用 pow 函数或者 << 运算去求解。

比如我们表示 2^31 - 1,可能会使用 pow(2, 31) - 1,或者 (1 << 31) - 1

但是需要注意的是:(1 << 31) 的结果居然是负数????这个大家自己去网上搜搜资料看看。因此更推荐使用 pow 方式,当然,你能记得具体 int 最大最小值更好。

C源码实现

cpp 复制代码
int reverse(int x){
    long res = 0;

    while(x != 0) {
        res = res * 10 + x % 10;

        if(res >= INT_MAX || res <= INT_MIN) {
            return 0;
        }

        x /= 10;
    }

    return res;
}

C++源码实现

cpp 复制代码
class Solution {
public:
    int reverse(int x) {
        long res = 0;

        while(x != 0) {
            res = res * 10 + x % 10;

            if(res >= INT_MAX || res <= INT_MIN) {
                return 0;
            }

            x /= 10;
        }

        return (int) res;
    }
};

Java源码实现

java 复制代码
class Solution {
    public int reverse(int x) {
        long res = 0;

        while (x != 0) {
            res = res * 10 + x % 10;

            if(res >= Integer.MAX_VALUE || res <= Integer.MIN_VALUE) {
                return 0;
            }

            x /= 10;
        }

        return (int) res;
    }
}

Python源码实现

python 复制代码
class Solution(object):
    def reverse(self, x):
        """
        :type x: int
        :rtype: int
        """
        res = 0

        sign = -1 if x < 0 else 1

        int_max = pow(2, 31) - 1
        int_min = -pow(2, 31)

        while x != 0:
            res = res * 10 + abs(x) % 10 * sign

            if res >= int_max or res <= int_min:
                return 0

            x = abs(x) / 10 * sign

        return res

JavaScript源码实现

javascript 复制代码
/**
 * @param {number} x
 * @return {number}
 */
var reverse = function (x) {
  let res = 0;

  const INT_MAX = Math.pow(2, 31) - 1;
  const INT_MIN = -Math.pow(2, 31);

  while (x != 0) {
    res = res * 10 + (x % 10);

    if (res >= INT_MAX || res <= INT_MIN) {
      return 0;
    }
    
    x = parseInt(x / 10);
  }

  return res;
};
相关推荐
小张小张爱学习1 分钟前
Spring Boot 多线程并发入门教程:ThreadPoolTaskExecutor + CompletableFuture
java·spring boot·后端
ST——Jess1 分钟前
2026年度传统文化数字化与命理科技(Ethno-tech)行业趋势研究报告:专业级数智工作台的技术壁垒与评测标准
人工智能·科技·算法·架构
西安邮电大学4 分钟前
Redis核心数据结构以及应用场景
java·redis·后端·其他·面试
麻雀飞吧9 分钟前
2026年期货量化入门路径:主流平台学习曲线与卡点观察
python
TechWayfarer9 分钟前
IP数据接口调用示例:社交软件如何做同城匹配与用户画像分析
python·网络协议·tcp/ip·社交电子
aqi0012 分钟前
15天学会AI应用开发(二)为什么编写提示词这么重要
人工智能·python·大模型·ai编程·ai应用
_Evan_Yao12 分钟前
线性代数 + 编程:用Python实现向量和矩阵运算
python·线性代数·矩阵
优雅格子衫12 分钟前
uniapp 拍照相册选取后超级好用的裁剪组件,增加水印完全自定义
开发语言·前端·javascript·uni-app·vue
NiceCloud喜云13 分钟前
Claude Code 跑 HyperFrames 实测:本地生成 AI 视频素材全流程
java·运维·人工智能·自动化·json·音视频·飞书
xcyxiner13 分钟前
ubuntu下 cmake初始化脚本 以及 qt依赖
c++·qt