leetCode 7 Reverse Integer

leetcode.windliang.cc/ 第一時間發佈java

題目描述(簡單難度)

很簡單,就是輸入整數,輸出它的倒置。spa

第一反應就是, 取餘獲得個位數,而後除以 10 去掉個位數,而後用一個變量保存倒置的數。3d

public int reverse(int x) {
    int rev = 0;
    while (x != 0) {
        int pop = x % 10;
        x /= 10;
        rev = rev * 10 + pop;
    }
    return rev;
}
複製代碼

而後彷佛不是那麼理想。code

爲何呢?倒置過來不該該是 9646324351 嗎。其實題目裏講了,int 的範圍是 $$[-2^{31} ,2^{31}-1]$$ 也就是 $$[-2147483648,2147483647] $$ 。明顯 9646324351 超出了範圍,形成了溢出。因此咱們須要在輸出前,判斷是否溢出。cdn

問題的關鍵就是下邊的一句了。blog

rev = rev * 10 + pop;leetcode

爲了區分兩個 rev ,更好的說明,咱們引入 temp 。get

temp = rev * 10 + pop;it

rev = temp;io

咱們對 temp = rev * 10 + pop; 進行討論。intMAX = 2147483647 , intMin = - 2147483648 。

對於大於 intMax 的討論,此時 x 必定是正數,pop 也是正數。

  • 若是 rev > intMax / 10 ,那麼沒的說,此時確定溢出了。
  • 若是 rev == intMax / 10 = 2147483647 / 10 = 214748364 ,此時 rev * 10 就是 2147483640 若是 pop 大於 7 ,那麼就必定溢出了。可是!若是假設 pop 等於 8,那麼意味着原數 x 是 8463847412 了,輸入的是 int ,而此時是溢出的狀態,因此不可能輸入,因此意味着 pop 不可能大於 7 ,也就意味着 rev == intMax / 10 時不會形成溢出。
  • 若是 rev < intMax / 10 ,意味着 rev 最大是 214748363 , rev * 10 就是 2147483630 , 此時再加上 pop ,必定不會溢出。

對於小於 intMin 的討論同理。

public int reverse(int x) {
    int rev = 0;
    while (x != 0) {
        int pop = x % 10;
        x /= 10;
        if (rev > Integer.MAX_VALUE/10 ) return 0;
        if (rev < Integer.MIN_VALUE/10 ) return 0;
        rev = rev * 10 + pop;
    }
    return rev;
}
複製代碼

時間複雜度:循環多少次呢?數字有多少位,就循環多少次,也就是 $$log_{10}(x) + 1$$ 次,因此時間複雜度是 O(log(x))。

空間複雜度:O(1)。

固然咱們能夠不用思考那麼多,用一種偷懶的方式 AC ,咱們直接把 rev 定義成 long ,而後輸出前判斷 rev 是否是在範圍內,不在的話直接輸出 0 。

public int reverse(int x) {
    long rev = 0;
    while (x != 0) {
        int pop = x % 10;
        x /= 10;
        rev = rev * 10 + pop;
    }
    if (rev > Integer.MAX_VALUE || rev < Integer.MIN_VALUE ) return 0;
    return (int)rev;
}
複製代碼

總結

比較簡單的一道題,主要是在考判斷是否是溢出,又是輕鬆的一天!

相關文章
相關標籤/搜索