Skip to content

Latest commit

 

History

History
112 lines (78 loc) · 4.18 KB

0007.md

File metadata and controls

112 lines (78 loc) · 4.18 KB
title description keywords
7. 整数反转
LeetCode 7. 整数反转题解,Reverse Integer,包含解题思路、复杂度分析以及完整的 JavaScript 代码实现。
LeetCode
7. 整数反转
整数反转
Reverse Integer
解题思路
数学

7. 整数反转

🟠 Medium  🔖  数学  🔗 力扣 LeetCode

题目

Given a signed 32-bit integer x, return x with its digits reversed. If reversing x causes the value to go outside the signed 32-bit integer range [-2^31, 2^31 - 1], then return 0.

Assume the environment does not allow you to store 64-bit integers (signed or unsigned).

Example 1:

Input: x = 123

Output: 321

Example 2:

Input: x = -123

Output: -321

Example 3:

Input: x = 120

Output: 21

Constraints:

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

题目大意

给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转。注意:假设我们的环境只能存储得下 32 位的有符号整数,则其数值范围为  [−2^31,  2^31 − 1]。请根据这个假设,如果反转后整数溢出那么就返回 0。

解题思路

  1. 符号处理:

    • 首先检查 x 是否为负数。通过 isNegative 变量记录符号,后续反转操作时只需要处理正整数部分。
    • 如果 x 为负数,反转后的结果应该保持负号,反之为正数。
  2. 反转操作:

    • x 进行逐位反转:每次取 x 的最后一位 (x % 10),将其加到 temp(反转后的结果)上,然后将 x 除以 10。
    • 通过 Math.floor(x / 10) 来去除 x 的最后一位。
  3. 溢出检测:

    • 在每次更新 temp 后,立即检查 temp 是否超出了 32 位有符号整数的范围。如果超出范围,则返回 0。
    • 32 位有符号整数的范围是 [-2^31, 2^31 - 1],即 -21474836482147483647
  4. 最终返回值:

    • 在反转完成后,乘以原始整数的符号 isNegative 来恢复原始符号,返回结果。

复杂度分析

  • 时间复杂度: O(log(x)),其中 x 是输入的整数。每次通过除以 10 来去掉一位数字,所以时间复杂度是对 x 的位数的对数级别。
  • 空间复杂度: O(1),只使用了常数空间来存储变量。

代码

/**
 * @param {number} x
 * @return {number}
 */

var reverse = function (x) {
	// 判断是否为负数
	const isNegative = x < 0 ? -1 : 1;

	// 将负数转为正数进行处理
	let temp = 0;
	x *= isNegative;

	// 反转数字
	while (x > 0) {
		temp = temp * 10 + (x % 10); // 将最后一位加到 temp
		x = Math.floor(x / 10); // 去掉最后一位

		// 检查是否溢出
		if (temp < -(2 ** 31) || temp > 2 ** 31 - 1) return 0;
	}

	// 恢复符号并返回结果
	return temp * isNegative;
};

相关题目

题号 标题 题解 标签 难度 力扣
8 字符串转换整数 (atoi) [✓] 字符串 🟠 🀄️ 🔗
190 颠倒二进制位 [✓] 位运算 分治 🟢 🀄️ 🔗
2119 反转两次的数字 [✓] 数学 🟢 🀄️ 🔗
2442 反转之后不同整数的数目 数组 哈希表 数学 1+ 🟠 🀄️ 🔗