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

Posted 简单的老王

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了7. 反转整数 [leetcode 7: Reverse Integer]相关的知识,希望对你有一定的参考价值。

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位的问题. 剩余代码就比较简单了.

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


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

咱下一题继续~~

以上是关于7. 反转整数 [leetcode 7: Reverse Integer]的主要内容,如果未能解决你的问题,请参考以下文章

LeetCode 7. 整数反转

Leetcode 7. 整数反转-简单

LeetCode Golang 7. 整数反转

Leetcode 7 反转整数

前端与算法 leetcode 7. 整数反转

Python版[leetcode]7. 整数反转(难度简单)