• 算法练习-Reverse Integer


    翻转整数

    来源

    https://leetcode.com/problems/reverse-integer/

    要求

    把一个整数倒序输出。例如:
    Example1: x = 123, return 321
    Example2: x = -123, return -321

    思路

    假设 x = 3647

    1. 不考虑溢出的情况,先把 x 中的每一位的数字都依次记录到 digits[n] = {7, 4, 6, 3},再利用digits[n] 中的数字转化成整数;
    2. 但会出现的问题主要是溢出:
    // 最大、最小整数是
    static const int MAX_INT = (int)((unsigned)~0 >> 1);    // 对 0 取反后右移一位
    static const int MIN_INT = -(int)(unsigned)~0 >>1) - 1;    //  负数多一个(存储时 0 占了个整数位)
    

    2.1 在依次记录每个位上的数字时,会遇到溢出的情况,需要处理当位数达到与 MAX_INT / 10 相同时最后一位(x中的最高位),特别是 x = MIN_INT 时,因此在判断时采用-abs(x) <= -decimal

    while(-abs(x) <= -decimal && abs(decimal) < MAX_INT / 10){ 
    		digits[n++] = (x % decimal) / (decimal / 10);  // 记录每一位的数,从后往前   
    		decimal *= 10;
    }
    

    2.2 在把 digits[n] 中数字转化的成整数时也会有溢出情况,在加入高位数字时,要保证加入后不溢出。

    实现代码

    int reverse(int x) {
        static const int MAX_INT = (int)((unsigned)~0 >> 1);
        int n = 0;
        int decimal = 10;
        int digits[16] = {};
    
        if(x > -10 && x < 10){
            return x;
        }
    
        while(-abs(x) <= -decimal && abs(decimal) < MAX_INT / 10){
            digits[n++] = (x % decimal) / (decimal / 10);  // 记录每一位的数,从后往前   
            decimal *= 10;
        }
        // digits[n] = x / (decimal / 10);
        int revx = x / (decimal / 10);
        if(abs(revx) > 10)
        {
            digits[n++] = revx % 10;
            revx /= 10;
        }
        decimal = 10;
        while(n--){
            if (abs(revx) < MAX_INT % 1000000000)
            {
                revx = digits[n] * decimal + revx;
                decimal *= 10;
            }
            else
                return 0;
        }
    
        return revx;
    }
    
  • 相关阅读:
    1864: [Zjoi2006]三色二叉树
    3611: [Heoi2014]大工程
    2286: [Sdoi2011]消耗战
    2298: [HAOI2011]problem a
    2037: [Sdoi2008]Sue的小球
    P4512 【模板】多项式除法
    P4238 【模板】多项式求逆
    3771: Triple
    P3365 改造二叉树
    1191: [HNOI2006]超级英雄Hero
  • 原文地址:https://www.cnblogs.com/nobodyzhou/p/5553663.html
Copyright © 2020-2023  润新知