演算法2 整數反轉(考慮反轉溢位問題)

2021-10-03 17:30:17 字數 1875 閱讀 6552

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

示例1:

輸入: 123

輸出: 321

示例2:

輸入: -123

輸出: -321

示例3:

輸入: 120

輸出: 21

注意:

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

如果這個問題不考慮溢位是很好解決的,剛遇到這個問題的時候通常不能馬上想出最優解。

這個思路略微繁瑣,但是可行:利用棧,將數依次除以10的餘數存入棧中,然後再從棧中取出經過計算反轉。這個演算法所花費的時間較多,一是出棧入棧,二是計算。

class

solution

if(i!=0)

while

(i>1)

return sum;

}public

intmultiply

(int t)

return s;

}}

ok,當我執行的時候,提示**執行時間過長,說明效率極低。馬上我們可以思考,能不能用純數學解決呢?

如果我們還是不考慮溢位的話,仔細觀察反轉前後數字的關係,我們可以用純數學思維解決。如下**,假設輸入x=123

第一次迴圈結束:n=0+3=3x=12

第二次迴圈結束:n=3*10+2=32x=1

第三次迴圈結束:n=32*10+1=321x=0

結束迴圈,輸出n的值

class

solution

return

(int

)n==n?

(int

)n:0;}

}

那麼這個演算法是不是更加容易理解,而且高效呢?

時間複雜度為o(n)

測試的時候不是用123,而是比較大的數字做反轉測試,結果如下:

但是這裡有個不足之處,就是沒有考慮溢位,如果乙個32位機輸入數字反轉之後超過32位,那麼該演算法就是存在問題的。

所以正數pop>7 負數pop

**:

class

solution

return ans;

}}

時間複雜度為o(log(n))

所以通過這個簡單演算法題,我明白演算法思路很重要,學習演算法不應該僅僅知道或者記住最優解,應該從自己最原始思路出發,一步步思考優化。

菜鳥會繼續加油的!

演算法題2 整數反轉

1 字串法 將數字轉化為字串,然後利用stringbuffer類的reverse 方法反轉字串,最後通過integer.parseint 將字串轉化為整數進行輸出 private int reverse1 int input return input 0 integer.parseint res i...

反轉整數演算法

演算法要求 給定乙個 32 位有符號整數,將整數中的數字進行反轉。給定乙個 32 位有符號整數,將整數中的數字進行反轉。示例 1 輸入 123 輸出 321 示例 2 輸入 123 輸出 321 示例 3 輸入 120 輸出 21 注意 假設我們的環境只能儲存 32 位有符號整數,其數值範圍是 2 ...

演算法 整數反轉

題目 給出乙個 32 位的有符號整數,你需要將這個整數中每位上的數字進行反轉。示例 1 輸入 123 輸出 321 示例 2 輸入 123 輸出 321 示例 3 輸入 120 輸出 21 注意 假設我們的環境只能儲存得下 32 位的有符號整數,則其數值範圍為 231,231 1 請根據這個假設,如...