1. 程式人生 > >Lintcode 反轉整數

Lintcode 反轉整數

題目

將一個整數中的數字進行顛倒,當顛倒後的整數溢位時,返回 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;
    }
};