Lintcode 反轉整數

水果先生發表於2016-12-14

題目

將一個整數中的數字進行顛倒,當顛倒後的整數溢位時,返回 0 (標記為 32 位整數)。

樣例

給定 x = 123,返回 321

給定 x = -123,返回 -321

class Solution {
public:
    /**
     * @param n the integer to be reversed
     * @return the reversed integer
     */
    int reverseInteger(int n) {
        // Write your code here

        //如何判斷整數的溢位?
        //如何判斷整數反轉後的溢位?是不是應該換成long

        bool flag=true;
        long res=0;

        //輸入非法
        if(n>=2147483648||n<=-2147483648)
            return 0;

        //反轉操作 
        else
        {
            vector<int> vec;
            if(n<0)
            {
                flag=false;
                n=-n;
            }
            while(n!=0)
            {
                //得到每一位的數字加入容器尾端
                vec.push_back(n%10);
                n/=10;
            }
            //求反轉後的數字
            for(auto c:vec)
                res=res*10+c;
        }

        //反轉之後的判斷
        if(res>=2147483648)
        {
            return 0;
        }
        else if(flag==false)
            return -res;
        else
            return res;
    }
};

優化

我們可以一邊計算res的值一邊判斷res是否越界

class Solution {
public:
    /**
     * @param n the integer to be reversed
     * @return the reversed integer
     */
    int reverseInteger(int n) {
        // Write your code here

        //如何判斷整數的溢位?
        //如何判斷整數反轉後的溢位?是不是應該換成long

        long res=0;

        //輸入非法
        if(n>=2147483648||n<=-2147483648)
            return 0;

        //反轉操作 
        else
        {
            vector<int> vec;
            while(n!=0)
            {
                //得到每一位的數字加入容器尾端
                vec.push_back(n%10);
                n/=10;
            }
            //求反轉後的數字,並判斷數字是否越界
            for(auto c:vec)
            {
                res=res*10+c;
                if(res>=2147483648)
                    return 0;
            }
        }
        return res;
    }
};

再優化,因為res在計算的過程中,如果發生越界,那麼得到的值/10操作肯定不會等於未加之前的值,則,res也可以宣告為int型別。

class Solution {
public:
    /**
     * @param n the integer to be reversed
     * @return the reversed integer
     */
    int reverseInteger(int n) {
        int result = 0;
        while (n) {
            auto prev = result;
            result *= 10;
            result += n % 10;
            if (result / 10 != prev) {
                result = 0;
                break;
            }
            n /= 10;
        }
        return result;
    }
};

相關文章