LeetCode 打卡 Day11 — 整数反转

本文介绍了一种在不使用64位整数的情况下,对32位整数进行反转的方法,并确保反转后的数字仍在32位整数范围内。通过循环实现数字反转,并通过特定条件判断来避免溢出。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. 题目

注:int32的范围 :-2147483648 ~ 2147483647

2. 题解

        单纯的反转难度不大,重点在于不使用64位整数的条件下,判断反转后的数字是否超出32位整数的范围。设最大,最小整数分别为 INTmax 和 INTmin,原整数为 a 反转后的整数为 rev,则rev满足:

\left [ \frac{INTmin}{10} \right ] + (-8) \leq rev \leq \left [ \frac{INTmax}{10} \right ] + 7

整个解题思路如下:

(1)数字反转:反转的实现较为简单,基本循环如下:rev = rev*10 + a%10;a = a/10

(2)范围判断:将 rev 拆分为 \left [ \frac{rev}{10} \right ] + digit,满足以下条件时,整数未超界

  • \left [ \frac{INTmin}{10} \right ] < \left [ \frac{rev}{10} \right ] < \left [ \frac{INTmax}{10} \right ]  
  • \left [ \frac{INTmin}{10} \right ] = \left [ \frac{rev}{10} \right ]  且 -8 \leq digit \leq 7

 考虑到当等号满足时,a 的最高位即 digit 为2 ,必属于[-8,7],所以范围判断只要满足 

 \left [ \frac{INTmin}{10} \right ] \leq \left [ \frac{rev}{10} \right ] \leq \left [ \frac{INTmax}{10} \right ] 即可。

代码实现如下:

func reverse(x int) int {
    var minBoundary, maxBoundary int = math.MinInt32/10, math.MaxInt32/10
    var rev int = 0
    
    for i:=x; i!=0; i=i/10{
        if minBoundary<=rev && rev<=maxBoundary{
            rev = rev*10 + i%10
        }else{
            return 0
        }
    }
    return rev
}

提交结果: 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值