zoukankan      html  css  js  c++  java
  • 算法练习-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;
    }
    
  • 相关阅读:
    C#-练习题
    C#-命名空间(十五)
    C#-枚举(十三)
    C#-多态(十二)
    C#-继承(十一)
    C#-结构体(十)
    C#-类(九)
    C#-方法(八)
    二叉树深度遍历和广度遍历
    iOS main.m解析
  • 原文地址:https://www.cnblogs.com/nobodyzhou/p/5553663.html
Copyright © 2011-2022 走看看