• LeetCode50天刷题计划(Day 6—— 整数反转 14.20-15.20)


    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


    前言

    今天的题好简单

    一、题目

    整数反转

    给你一个 32 位的有符号整数 x ,返回将 x 中的数字部分反转后的结果。

    如果反转后整数超过 32 位的有符号整数的范围 [−231, 231 − 1] ,就返回 0。

    假设环境不允许存储 64 位整数(有符号或无符号)。

    示例

    示例 1:
    输入:x = 123
    输出:321

    示例 2:
    输入:x = -123
    输出:-321

    示例 3:
    输入:x = 120
    输出:21

    示例 4:
    输入:x = 0
    输出:0

    提示

    -231 <= x <= 231 - 1

    二、思路

    1.python

    没啥难度,输入后和输出前判断两次范围,中间无脑反转字符串就行了
    需要注意python切片步长为-1时下标是从后往前算的,其中s【start,end,-1】中,切出[start,end)的序列(已反转),故end是小下标,start是大下标。

    2.c++

    传统做法应该是数学方法,while循环取模求余依次得到从后往前的每一位(cur=x%10;x=x/10),
    对于每一位把他加入结果result中(result=result*10+cur)

    需要注意:
    INT_MAX = 2^31-1,INT_MIN= -2^31
    在这里插入图片描述
    ②在形成结果的过程中不断判断范围,一旦出现上溢出或下溢出,立即返回0
    本题假设环境不允许存储 64 位整数,因此输入不会有溢出,只能是在反转的过程中,在形成result中出现溢出。也就是result*10+num>INT_MAX or result*10+num;为了在计算前判断,则通过逆运算有:
    上溢出条件:
    在这里插入图片描述

    下溢出条件:
    在这里插入图片描述
    ③复杂度分析
    在这里插入图片描述

    log(x)相当于取x的位数,因为要遍历x的每一位
    空间上只需要原地乘,O(1)

    三、代码

    1.python

    class Solution:
        def reverse(self, x: int) -> int:
            #计算上下边界
            edge=pow(2,31)
            down=-edge
            up=edge-1
            #如果在边界外,返回0
            if(x<down or x>up):
                return 0
            #如果是负数,先将去掉符号的部分转为字符串然后反转然后转为int然后加上符号
            if(x<0):
                re=-(int(str(x)[:0:-1]))
            #正数不用在意负号,直接反转即可
            else:
                re=int(str(x)[::-1])
            #要保证输出的结果也在范围内
            if(re<down or re>up):
                return 0
            else:
                return re
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    在这里插入图片描述

    2.c++

    class Solution {
    public:
        int reverse(int x) {
            //结果
            int result=0;
            //当前数字
            int cur = 0;
            //遍历每一位
            while(x != 0){
                cur = x%10;
                x/=10;
                if(result>INT_MAX/10 || result == INT_MAX/10 && cur>INT_MAX%10){
                    return 0;
                }
                if(result<INT_MIN/10 || result == INT_MIN/10 && cur<INT_MIN%10){
                    return 0;
                }
                result = result*10 + cur;    
            }
            return result;
    
        }
    };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23

    在这里插入图片描述

  • 相关阅读:
    .gitignore不生效的解决方案
    大数据营销促进消费品牌增长,消费品投资回归常识思维
    【论文解读】Faster sorting algorithm
    LVS负载均衡群集-NAT模式实例
    Java执行动态脚本
    Rabbitmq入门教程
    基于改进海洋捕食者算法求解单目标优化问题附matlab代码(NMPA)
    SQL及数据库基础知识点总结
    2022 世界人工智能大会|人工智能与开源技术先锋论坛成功举办
    看看面试要价25K的软件测试工程师,技术面都问他些什么问题?我上我也行
  • 原文地址:https://blog.csdn.net/weixin_46447549/article/details/126013762