第七题:整数反转(Reverse Integer)

题目描述:

给定一个 32 位有符号整数 x,返回其反转后的整数。反转后的整数可能会超出 32 位整数的范围,因此需要注意处理溢出情况。

示例:

  1. 输入:x = 123
    输出:321

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

  3. 输入:x = 120
    输出:21

  4. 输入:x = 0
    输出:0

要求: 需要考虑反转后的整数是否会超出 32 位整数的范围。32 位有符号整数的范围是 ([-2^{31}, 2^{31} - 1]),即 ([-2147483648, 2147483647])。

解题思路

  1. 处理符号

    • 记录整数的符号(正或负),然后将整数转为正数来进行处理。
  2. 反转整数

    • 通过逐位提取整数的末尾数字,并将其添加到新整数的末尾,从而反转整数。
  3. 检查溢出

    • 在每次更新反转结果时,检查是否会发生溢出。如果结果超出了32位整数的范围,则返回0。

C 语言实现

#include <limits.h>

int reverse(int x) {
    int reversed = 0;
    while (x != 0) {
        int digit = x % 10;
        // Check for overflow/underflow
        if (reversed > (INT_MAX - digit) / 10 || reversed < (INT_MIN - digit) / 10) {
            return 0;
        }
        reversed = reversed * 10 + digit;
        x /= 10;
    }
    return reversed;
}

Java 实现

public class Solution {
    public int reverse(int x) {
        int reversed = 0;
        while (x != 0) {
            int digit = x % 10;
            // Check for overflow/underflow
            if (reversed > Integer.MAX_VALUE / 10 || (reversed == Integer.MAX_VALUE / 10 && digit > 7)) {
                return 0;
            }
            if (reversed < Integer.MIN_VALUE / 10 || (reversed == Integer.MIN_VALUE / 10 && digit < -8)) {
                return 0;
            }
            reversed = reversed * 10 + digit;
            x /= 10;
        }
        return reversed;
    }
}

Python 实现

def reverse(x: int) -> int:
    reversed_x = 0
    sign = -1 if x < 0 else 1
    x *= sign
    
    while x != 0:
        digit = x % 10
        # Check for overflow/underflow
        if reversed_x > (2**31 - 1 - digit) // 10:
            return 0
        reversed_x = reversed_x * 10 + digit
        x //= 10
    
    return reversed_x * sign

时间复杂度

时间复杂度: (O(\log_{10} n)),其中 (n) 是输入整数的绝对值。因为我们处理的每一位数字需要一次操作,整数的位数与其值的对数成正比。

空间复杂度: (O(1))。我们只使用了常数级别的额外空间来存储反转后的结果和处理过程中的变量。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

冰魄雕狼

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值