1. 程式人生 > 其它 >【刷穿 LeetCode】7. 整數反轉(簡單)

【刷穿 LeetCode】7. 整數反轉(簡單)

技術標籤:刷穿 LeetCode資料結構演算法leetcodejavapython

題目描述

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

注意:

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

示例 1

輸入:x = 12 輸出:321

示例 2:

輸入:x = -123 輸出:-321

示例 3:

輸入:x = 120 輸出:21

示例 4:

輸入:x = 0 輸出:0

提示:

  • -2^31 <= x <= 2^31 - 1

不完美解法

還記得我在 “【刷穿 LeetCode】4. 尋找兩個正序陣列的中位數” 教過你的技巧嗎?

在機試或者周賽這種需要快速 AC 的場景中,遇到這種從文字上進行限制的題目,可以選擇性的忽略限制。

對於本題,題目從文字上限制我們只能使用 32 位的資料結構(int)。

但由於資料範圍過大,使用 int 會有溢位的風險,所以我們使用 long 來進行計算,在返回再轉換為 int :

class Solution {
    public int reverse(int x) {
        long ans = 0;
        while (x != 0) {
            ans =
ans * 10 + x % 10; x = x / 10; } return (int)ans == ans ? (int)ans : 0; } }

時間複雜度:數字 x 的位數,數字大約有 log ⁡ 10 x \log{10}{x} log10x 位。複雜度為 log ⁡ 10 x \log{10}{x} log10x

空間複雜度: O ( 1 ) O(1) O(1)


完美解法

在「不完美解法」中,我們使用了不符合文字限制的 long 資料結構。

接下來我們看看,不使用 long 該如何求解。

從上述解法來看,我們在迴圈的 ans = ans * 10 + x % 10

這一步會有溢位的風險,因此我們需要邊遍歷邊判斷是否溢位:

  • 對於正數而言:溢位意味著 ans * 10 + x % 10 > Integer.MAX_VALUE,對等式進行變化後可得 ans > (Integer.MAX_VALUE - x % 10) / 10)。所以我們可以根據此變形公式進行預判斷

  • 對於負數而言:溢位意味著 ans * 10 + x % 10 < Integer.MIN_VALUE,對等式進行變化後可得 ans < (Integer.MIN_VALUE - x % 10) / 10)。所以我們可以根據此變形公式進行預判斷

class Solution {
    public int reverse(int x) {
        int ans = 0;
        while (x != 0) {
            if (x > 0 && ans > (Integer.MAX_VALUE - x % 10) / 10) return 0;
            if (x < 0 && ans < (Integer.MIN_VALUE - x % 10) / 10) return 0;
            ans = ans * 10 + x % 10;
            x /= 10;
        }
        return ans;
    }
}

時間複雜度:數字 x 的位數,數字大約有 log ⁡ 10 x \log{10}{x} log10x 位。複雜度為 log ⁡ 10 x \log{10}{x} log10x

空間複雜度: O ( 1 ) O(1) O(1)


最後

這是我們「刷穿 LeetCode」系列文章的第 No.7 篇,系列開始於 2021/01/01,截止於起始日 LeetCode 上共有 1916 道題目,部分是有鎖題,我們將先將所有不帶鎖的題目刷完。

在這個系列文章裡面,除了講解解題思路以外,還會盡可能給出最為簡潔的程式碼。如果涉及通解還會相應的程式碼模板。

由於 LeetCode 的題目隨著周賽 & 雙週賽不斷增加,為了方便我們統計進度,我們將按照系列起始時的總題數作為分母,完成的題目作為分子,進行進度計算。當前進度為 7/1916

為了方便各位同學能夠電腦上進行除錯和提交程式碼,我建立了相關的倉庫:Github 地址 & Gitee 地址

在倉庫地址裡,你可以看到系列文章的題解連結、系列文章的相應程式碼、LeetCode 原題連結和一些其他的優選題解。

#演算法與資料結構

#LeetCode題解

#演算法面試

宮水三葉的刷題日記