【刷穿 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題解
#演算法面試