算法练习-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;
}
posted @ 2016-06-02 16:58  NobodyZhou  阅读(124)  评论(0编辑  收藏  举报