• 【LeetCode-数学】整数反转


    题目描述

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

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

    题目链接: https://leetcode-cn.com/problems/reverse-integer/

    思路

    题目的难点在于反转过程中整数可能溢出,所以在反转过程中要判断是否溢出。有符号int的范围为-2147483648到2147483647,所以有两种情况会溢出(假设当前反转的结果为ans,输入为x, MAX_VALUE=2147483647, MIN_VALUE=-2147483648):

    • ans > MAX_VALUE/10 || (ans==MAX_VALUE/10 && x%10>7) // x>=0
    • ans < MIN_VALUE/10 || (ans==MIN_VALUE/10 && x%10<-8) // x<0

    有一点需要注意,上面的条件中ans > MAX_VALUE/10不能写成ans*10 > MAX_VALUE,因为ans*10可能会超过int的表示范围从而出现runtime error。
    代码如下:

    class Solution {
    public:
        int reverse(int x) {
            
            int MAX_INT = 0x7fffffff;
            int ans = 0;
            bool isNegative = x<0? true:false;
            x = abs(x);
            while(x>0){
                if(ans>MAX_INT/10 || (ans==MAX_INT/10 && x%10>7)) return 0;
                ans = ans*10 + x%10;
                x /= 10;
            }
            if(isNegative) ans = -ans;
            return ans;
        }
    };
    

    在上面的代码中,将数取绝对值统一转为正数后判断。

    • 时间复杂度:O(n)
      n为数字的长度(lgx)。
    • 空间复杂度:O(1)

    这题还有一点需要注意,下面的写法虽然能通过,但是是不对的,因为题目假设环境只能存储得下 32 位的有符号整数,而代码却使用了long:

    class Solution {
    public:
        int reverse(int x) {
            
            int MAX_INT = 0x7fffffff;
            long ans = 0;
            bool isNegative = x<0? true:false;
            x = abs(x);
            while(x>0){
                ans = ans*10+x%10;
                x/=10;
                if(ans>MAX_INT) return 0;   // 溢出
            }
            if(isNegative) ans = -ans;
            return ans;
        }
    };
    
  • 相关阅读:
    Codeforces Round #615 (Div. 3)
    「网络流 24 题」最长 k 可重区间集
    「网络流 24 题」方格取数
    「网络流 24 题」试题库
    debian服务sh启动java,设置开机启动
    debian重置root密码
    uwsgi加载ini文件,nginx重新加载,查看配置文件路劲
    pptpd启动
    android studio java lib不能直接运行
    clipChildren是否限制子控件在该容器所在的范围内
  • 原文地址:https://www.cnblogs.com/flix/p/12781234.html
Copyright © 2020-2023  润新知