《java算法系列打卡第四天》

給定一個 32 位有符號整數,將整數中的數字進行反轉。

示例 1:

輸入: 123
輸出: 321

 示例 2:

輸入: -123
輸出: -321

示例 3:

輸入: 120
輸出: 21

注意:

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

解決方案


方法:彈出和推入數字 & 溢出前進行檢查

思路

我們可以一次構建反轉整數的一位數字。在這樣做的時候,我們可以預先檢查向原整數附加另一位數字是否會導致溢出。

算法

反轉整數的方法可以與反轉字符串進行類比。

我們想重複“彈出” xx 的最後一位數字,並將它“推入”到 \text{rev}rev 的後面。最後,\text{rev}rev 將與 xx 相反。

要在沒有輔助堆棧 / 數組的幫助下 “彈出” 和 “推入” 數字,我們可以使用數學方法。

//pop operation:
pop = x % 10;
x /= 10;

//push operation:
temp = rev * 10 + pop;
rev = temp;

但是,這種方法很危險,因爲當 \text{temp} = \text{rev} \cdot 10 + \text{pop}temp=rev10+pop 時會導致溢出。

幸運的是,事先檢查這個語句是否會導致溢出很容易。

爲了便於解釋,我們假設 \text{rev}rev 是正數。

  1. 如果 temp = \text{rev} \cdot 10 + \text{pop}temp=rev10+pop 導致溢出,那麼一定有 \text{rev} \geq \frac{INTMAX}{10}rev10INTMAX
  2. 如果 \text{rev} > \frac{INTMAX}{10}rev>10INTMAX,那麼 temp = \text{rev} \cdot 10 + \text{pop}temp=rev10+pop 一定會溢出。
  3. 如果 \text{rev} == \frac{INTMAX}{10}rev==10INTMAX,那麼只要 \text{pop} > 7pop>7temp = \text{rev} \cdot 10 + \text{pop}temp=rev10+pop 就會溢出。

當 \text{rev}rev 爲負時可以應用類似的邏輯。

複雜度分析

  • 時間複雜度:O(\log(x))O(log(x))xx 中大約有 \log_{10}(x)log10(x) 位數字。
  • 空間複雜度:O(1)O(1)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章