跳至主要內容

7. 整数反转


7. 整数反转

🟠   🔖  数学  🔗 力扣open in new window LeetCodeopen in new window

题目

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)[✓]字符串🟠🀄️open in new window 🔗open in new window
190颠倒二进制位[✓]位运算 分治🟢🀄️open in new window 🔗open in new window
2119反转两次的数字[✓]数学🟢🀄️open in new window 🔗open in new window
2442反转之后不同整数的数目数组 哈希表 数学 1+🟠🀄️open in new window 🔗open in new window