給出乙個 32 位的有符號整數,你需要將這個整數中每位上的數字進行反轉。
示例1:
輸入: 123示例2:輸出: 321
輸入: -123示例3:輸出: -321
輸入: 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 請根據這個假設,如...