leetcode------7. 整數反轉(數學)

題目

給出一個 32 位的有符號整數,你需要將這個整數中每位上的數字進行反轉。

示例 1:

輸入: 123
輸出: 321
示例 2:

輸入: -123
輸出: -321
示例 3:

輸入: 120
輸出: 21
注意:

假設我們的環境只能存儲得下 32 位的有符號整數,則其數值範圍爲 [−231, 231 − 1]。請根據這個假設,如果反轉後整數溢出那麼就返回 0。

開始思考

我開始的想法是,利用%=和/=來分解數位,然後填入數組,然後輸出,但是leetcode是函數形式最後是需要將結果,以return int的形式返回去,於是我就遇到了,不知怎麼判斷數組空間有幾位數字的問題以及,如果末尾有0,存入數組後我應該如何解決呢。最後在看了官方題解的後:

它是這樣的:分解數位的思路是對的,但不用把它單獨存入數組裏這樣,在分解的過程就把它在乘起來,不用二次計算。

解題

class Solution {
public:
    int reverse(int x) {
        int rev = 0;
        while (x != 0) {
            int pop = x % 10;
            x /= 10;
            if (rev > INT_MAX/10 || (rev == INT_MAX / 10 && pop > 7)) return 0;
            if (rev < INT_MIN/10 || (rev == INT_MIN / 10 && pop < -8)) return 0;
            rev = rev * 10 + pop;//這步可能會溢出,所以在這之前一定一定要檢查,
        }
        return rev;
    }
};

複雜度分析

  • 時間複雜度:O(log(x)),x 中大約有log 10(x) 位數字。
  • 空間複雜度:O(1)。

反思記憶:

  • int的範圍是 -2147483648~~ 2147483647
    所以通過這個 pop>7 或 pop<-8 來判斷溢出。
  • INT_MAX是一個系統變量,自己還一開始打算傻乎乎的算出來2的31次方,打算用這個值。在#include<limits.h>頭文件裏面。
  • 由於字符串轉換的效率較低且使用較多庫函數,所以我在上面的初始思路可能系統效率並不好
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章