• Leetcode刷题记(2)——整数反转


    磕磕绊绊完成了第一道简单题,来到第二题又被难住了,每次都要感慨一下菜菜菜!

    【2】整数反转   简单

    搬运工~

    给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转。

    假设我们的环境只能存储得下 32 位的有符号整数,则其数值范围为 [−231,  231 − 1]。请根据这个假设,如果反转后整数溢出那么就返回 0。

    解法:如果只是正数的话很容易反转,只要使用除余运算遍历每位上的数字,再循环一次输出即可,时间复杂度与输入整数的位数有关。

    另外可以改进直接一步得到反转后的数字:在循环里面使用rev=rev*10+x%10;

    BUT!负数怎么算?

    难点放错地方了!!!负数也可以直接用除余运算,真正的难点应该是溢出问题怎么解决!!!

    分析一波:

    32位整数的范围是-2147483648~2147483647,在计算翻转数rev时可能会溢出

    eg:1000000009在循环计算rev时,90000000*10之后就会溢出报错,希望在溢出的时候直接输出0.

    正数:rev*10>INT_MAX时会溢出,因此在rev>INT_MAX/10时会溢出,或rev==INT_MAX/10 && x%10>7时溢出;

    负数:rev*10<INT_MIN时会溢出,因此在rev<INT_MIN/10时会溢出,或rev==INT_MIN/10 && x%10<-8时溢出。

    进一步分析:

    其实不用考虑rev==INT_MAX/10这种情况,因为输入的整数一定是在这个范围内,那么第一位数字一定是1或2,如果rev=214748364,则原数字第一位一定是1,反转后依然在范围内;如果是2原数字为246384712超出范围。由此以来只用考虑rev>INT_MAX/10这种情况。

    一定要注意这里是rev与INT_MAX/10比较而不是原数字x!!!

    知识点:负数除余;溢出解决

  • 相关阅读:
    ECS:Systems
    ECS:Components
    ECS:Entitias
    对List遍历过程中添加和删除的思考
    SpringBoot 推荐博客
    理解和解决Java并发修改异常ConcurrentModificationException(转载)
    我对CopyOnWrite的思考
    最简日志打印规范(推荐,转载)
    为什么不应该使用Zookeeper做服务发现?(转载)
    浏览器允许跨域设置(不用于生产环境,开发用)
  • 原文地址:https://www.cnblogs.com/wangjm63/p/10815467.html
Copyright © 2020-2023  润新知