专栏首页异名异名解题:7. 整数反转

异名解题:7. 整数反转

给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转。注意:假设我们的环境只能存储得下 32 位的有符号整数,则其数值范围为 [−2³¹, 2³¹ − 1]。请根据这个假设,如果反转后整数溢出那么就返回 0。

输入123,输出321 输入120,输出21 输入-123,输出-321

解题思路

方法一,字符串转数组,reverse后再转数字

很快就会想到取整,然后利用数组反转,然后加上符号位得到反转后的数字,然后判断是否溢出,如果溢出就返回0,然后写出了下面的代码,而且也通过了LeetCode的测试

function reverse(x) {
    let result = String(Math.abs(x)).split('').reverse().join('');
    result = x < 0 ? -result : +result;
    return result > Math.pow(2,31) - 1 || result < -Math.pow(2,31) ? 0 : result;
};

虽然它通过了测试,但是这样实现是有问题的,因为在一个只能存储得下32位的有符号整数的环境中,如果整数反转后的数值超过要求的数值范围,也就是这一步result = x < 0 ? -result : +result;,我们根本得不到 result,它会直接溢出。这里的话看语言的实现对溢出的处理,其实有两种做法(这里并没有做实践)

  • 如果溢出会报错的话,就try,catch包一下,捕获到报错就直接返回0;
  • 如果溢出不报错,那可以把溢出后的值再反转一下和输入对比,如果不一样就说明溢出了,直接返回0,如果一样就说明没有溢出,输出result就可以了

方法二,利用数学方法,按位取余并复原

取反除了利用数组的方法外,还可以利用数学的方法,数学中对10取余可以拿到最后一位数字,对10取除则可以去掉最后一位数字,同时在此基础上对溢出进行判断就可以了

function reverse(x) {
    let MAX_VALUE = Math.pow(2,31) - 1; // 2147483647
    let MIN_VALUE = -Math.pow(2,31); // -2147483648
    let result = 0;

    while (x != 0) {
        pop = x % 10;
        x = parseInt(x / 10);

        if (result > parseInt(MAX_VALUE / 10) || (result == parseInt(MAX_VALUE / 10) && pop > 7)) return 0;
        if (result < parseInt(MIN_VALUE / 10) || (result == parseInt(MIN_VALUE / 10) && pop < -8)) return 0;
        result = result * 10 + pop;
    }
    return result;
};

本文分享自微信公众号 - 异名(async-code),作者:异名君

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-07-02

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 游戏性能优化

    异名最近负责了一个微信小游戏的项目,在版本迭代间隙对游戏的性能调优进行了一次尝试。这个游戏是个打击类游戏,下面展示一下游戏的预览效果?

    异名
  • 从Chrome小恐龙游戏学习2D游戏制作

    在chrome浏览器的断网页面,按空格键或者向上键会出现一个小恐龙跑酷小游戏,这个2D小游戏在设计上精致小巧,在代码上也只有三千多行,思路清晰严谨,很有学习价值

    异名
  • 微信小游戏首包超出4M之后

    微信小游戏平台上对首包的的限制是4M,超出限制之后可以采取什么样的措施呢?异名做了一下盘算,大概可以有以下操作

    异名
  • AttributeError: 'list' object has no attribute 'keys'

    hankleo
  • Typo3 CVE-2019-12747 反序列化漏洞分析

    TYPO3是一个以PHP编写、采用GNU通用公共许可证的自由、开源的内容管理系统。

    知道创宇云安全
  • golang slice N选3 组合

    package main import( "fmt" ) func main(){ var a = []int32{1,2,3,...

    李海彬
  • python列表与元组的用法

    7.列表生成式   #[i*i for i in range(10)]       [i*i for i in range(10) if i>5]

    py3study
  • Typo3 CVE-2019-12747 反序列化漏洞分析

    TYPO3是一个以PHP编写、采用GNU通用公共许可证的自由、开源的内容管理系统。

    Seebug漏洞平台
  • 研报复制(四):基于Logistic回归的大小盘轮动

    一种是从技术面出发,基于量价指标建立模型,典型的比如上篇复制的基于相对强弱指标的大小盘轮动策略。

    量化小白
  • 2015.11.30 HTML5真题练习

    HTML5学堂:每天一道题,强壮程序员!今日主要涉及昨日题目的解答,以及一道涉及函数的形参实参、arguments对象的题目 HTML5真题【2015.11.2...

    HTML5学堂

扫码关注云+社区

领取腾讯云代金券