【LeetCode】 #7:反轉整數 C語言

最近打算練習寫代碼的能力,因此從簡單題開始作。
大部分仍是用C語言來解決。
@(解法).net

題目

給出一個 32 位的有符號整數,你須要將這個整數中每位上的數字進行反轉。
示例 1:
輸入: 123
輸出: 321
示例 2:
輸入: -123
輸出: -321
示例 3:
輸入: 120
輸出: 21
注意:假設咱們的環境只能存儲得下 32 位的有符號整數,則其數值範圍爲 [−231, 231 − 1]。請根據這個假設,若是反轉後整數溢出那麼就返回 0。code

具體連接 https://leetcode-cn.com/problems/reverse-integer/blog

思路

其實這算很基礎的問題了,首先就是想到利用循環結構,整數除法和取餘來解決。但也會遇到邊界值的問題,就要當心了。leetcode

初步想法

初步的想法就是用一個while循環,在循環裏面解決取餘和倒序相加的工做。it

具體代碼以下:class

int reverse(int x) {
    int num = 0;
    while (x)
    {
        num = num * 10 + x % 10;
        if (num > INT_MAX || num < INT_MIN)//邊界值判斷
            return 0;
        x = x / 10;
    }
    return num;
}

可是這種結構很容易遇到一個問題,就是當num達到邊界時,再進行*10的運算就會==溢出==了,但判斷在運算以後。
可是我又想到在C語言中還有long int類型,因此只要定義num爲long int便可。
最後也經過了,代碼以下:基礎

int reverse(int x) {
    long int num = 0;
    while (x)
    {
        num = num * 10 + x % 10;
        if (num > INT_MAX || num < INT_MIN)
            return 0;
        x = x / 10;
    }
    return num;
}

總結:這種改善也只是一種取巧的方法,當數據更大時就沒辦法了,並且會浪費不少空間。循環

進一步想法

因而我看了官方題解,發現官方是經過判斷num與邊界值的距離來避免溢出的。
我首先將if判斷進行了替換,但發現仍是不能經過,由於最小的邊界仍是會溢出,而後我發現官方題解中是先判斷再進行倒序操做的,這樣就能夠有效解決問題了。方法

int reverse(int x) {
    int num = 0;
    while (x)
    {
        
        if (num > INT_MAX/10 || (num == INT_MAX / 10 && (x%10) > 7)) return 0;
        if (num < INT_MIN/10 || (num == INT_MIN / 10 && (x%10) < -8)) return 0;
        num = num * 10 + x % 10;
        x = x / 10;
    }
    return num;
}

我以爲這個方法要求的判斷條件太細緻了,而後去網上看了看其餘人的解法。有博主提到利用反推法判斷是否溢出,但其實這種方法也是先計算再判斷的。

具體連接 https://blog.csdn.net/bingkuoluo/article/details/83046469

我嘗試提交後發現仍然會面臨最大值溢出的問題,也不夠安全,暫時沒有找到更好的辦法。

總結

注意語句的順序問題,尤爲是判斷語句和判斷條件的運算的問題。 要考慮數據的溢出問題。 在本題中,仍是要先判斷,再運算。

相關文章
相關標籤/搜索