7. 反转整数 [leetcode 7: Reverse Integer]

9 篇文章 0 订阅
8 篇文章 0 订阅

7. 反转整数 [leetcode 7: Reverse Integer]

原题链接

https://leetcode.com/problems/reverse-integer

老王的解法链接

https://github.com/simplemain/leetcode/blob/master/7/analysis.md

难度

★★☆☆☆

标签

数字计算

题目描述

给一个32位有符号整数, 将这个整数的每一位进行反转.

注意: 假定我们的系统只能处理32位有符号整数[−231, 231 − 1]. 如果反转后越界, 则返回0.

输入样例

第一组: 123
第二组: -123
第三组: 120

输出样例

第一组: 321
第二组: -321
第三组: 21

解法分析


  • 解法1 : 朴素的解法

这道题晃眼一看, 好像很简单. 直接用整数取余, 然后再拼接就可以了. 只不过要注意有可能要越界, 所以用一个64位的long存储就可以了.

完整代码请点击这里: 完整代码


  • 解法2 : 带有一些技巧的解法

我们注意看这题特别加了一个注意, 假定系统只能处理32位带符号的整数.

这句话什么意思呢? 就是你不能使用64位的long!!!

(话说出这个题的人确实有点x)

那我们怎么解决呢?

其实考点就是很明确了: 我们需要考虑越界的问题.

要处理越界, 实际上就是要在越界之前, 就能提前判断, 他即将越界.

老王的思想就是: 管他越不越界, 我们把一个整数拆分成两段来存储.

比如, 我们将一个整数分解成三个部分:

  • 符号用整数sign存储;
  • 万位以上用一个整数upper来存储;
  • 万位以下用另外一个整数lower存储.

n = sign * (upper * 10000 + lower)

具体如下:

* n=9876543210  拆分成=> sign=1,  upper=987654, lower=3210
* n=-9876543210 拆分成=> sign=-1, upper=987654, lower=3210

这样, 我们把最大/最小32位整数也做类似处理: 
* 2147483647(2^311) => S=1, U_MAX=214748, L_MAX=3647
* -2147483648(-2^31)   => S=-1, U_MIN=214748, L_MIN=3648

这样, 只要我们判断:

if: sign == 1 && upper >= U_MAX && lower > L_MAX ; then 向上越界
if: sign == -1 && upper >= U_MIN && lower > L_MIN; then 向下越界

这样, 我们就规避掉了64位的问题. 剩余代码就比较简单了.

完整代码请点击这里: 完整代码


好了, 这一题就分析到这里. 如果觉得老王的讲解有意思或有帮助, 可以给老王点个赞或者打个赏啥的, 老王就很开心啦~

咱下一题继续~~

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值