1. 程式人生 > >《LeetBook》leetcode題解(7): Reverse Integer[E]——處理溢位的技巧

《LeetBook》leetcode題解(7): Reverse Integer[E]——處理溢位的技巧

我現在在做一個叫《leetbook》的開源書專案,把解題思路都同步更新到github上了,需要的同學可以去看看
書的地址:https://hk029.gitbooks.io/leetbook/

這裡寫圖片描述

007. Reverse Integer[E]——處理溢位的技巧

題目

Reverse digits of an integer.

Example1: x = 123, return 321
Example2: x = -123, return -321

思路

這題完全沒絲毫的難度,任何人幾分鐘都可以寫出來,但是,這題修改後,加入了一個新的測試,瞬間大家討論的就多了,就是——溢位測試

因為整數只有32位,可能原數不會溢位,但是轉置後就不一定了,所以必須要考慮溢位的情況。

思路1——用long

一個比較討巧的方案,直接用long不會溢位再和INT_MAX比較就好了

class Solution {
public:
    int reverse(int x) {
        long tmp=0;
        while(x != 0)
        {
            tmp *=10;
            tmp += x%10;
            if(tmp > INT_MAX || tmp < INT_MIN)
                return
0; x /= 10; } return tmp; } };

思路2——變化前後對比

bitzhuwei的程式碼。
不用任何flag和INT_MAX巨集或者任何硬編碼Ox7fffffff
這個思路 也是很容易理解的,做一些操作,如果溢位了,那溢位後的值做反向操作會和之前的值不一樣。

這裡就用一個變數儲存變化後的值,每次做反向操作,如果和之前的值一樣就更新,不一樣,說明溢位了。

public int reverse(int x)
{
    int result = 0;

    while (x != 0)
    {
        int
tail = x % 10; int newResult = result * 10 + tail; if ((newResult - tail) / 10 != result) { return 0; } result = newResult; x = x / 10; } return result; }

思路3——提前停止操作

如果當前的數已經>INT_MAX/10 那麼再做一次操作,必然溢位。

class Solution
{
public:
    int reverse(int n)
    {
        int result = 0;

        while (n != 0)
        {
            if (result > INT_MAX / 10
                    || ((result == INT_MAX / 10) && (n % 10 > INT_MAX % 10)))
            {
                result = 0;
                break;
            }
            if (result < INT_MIN / 10
                    || ((result == INT_MIN/ 10) && (n % 10 < INT_MIN % 10)))
            {
                result = 0;
                break;
            }
            result = result * 10 + n % 10;
            n = n / 10;
        }


        return result;
    }
};