線上課程 20 元 / 課時 / 人,上海釋出學科類校外培訓收費管理辦法和定價標準
阿新 • • 發佈:2022-01-01
題目來源
題目詳情
給你一個 32 位的有符號整數 x
,返回將 x
中的數字部分反轉後的結果。
如果反轉後整數超過 32 位的有符號整數的範圍[−231, 231− 1]
,就返回 0。
假設環境不允許儲存 64 位整數(有符號或無符號)。
示例 1:
輸入: x = 123
輸出: 321
示例 2:
輸入: x = -123
輸出: -321
示例 3:
輸入: x = 120
輸出: 21
示例 4:
輸入: x = 0
輸出: 0
提示:
-231 <= x <= 231 - 1
題解分析
- 本題是模擬題,本質是考察最大正整數和最小負整數的轉換。
- 其實,將數字進行翻轉是很容的,只需要每次使用除餘和除法進行取尾數並累積即可。
- 本題的困難是不能單純使用上面的步驟來翻轉數字,因為翻轉後的結果可能大於最大整數,但是又不能使用long來儲存臨時結果,所以我們得想辦法來判斷一個結果是否大於最大整數。
- 一開始,我想使用String的compareTo方法來比較轉換為字串後的整數,但是這種方法只能用於比較相同長度的字串,一旦數字相差很大則比較會錯誤。
- 本題可以考慮最大整數的特點,如下所示:
從上圖可以看到,我們可以在迴圈的過程中判斷字首是否大於32位整數的最大字首,如果大於則表示結果肯定大於32位整數;接著,如果倒數第二位字首相同,則判斷最後一位數字,如果大於也表示超出範圍。 - 負數也是一樣的,如下圖所示:
class Solution { public int reverse(int x) { int mins = Integer.MIN_VALUE; int maxs = Integer.MAX_VALUE; int mins_1 = mins / 10; int mins_2 = mins % 10; int maxs_1 = maxs / 10; int maxs_2 = maxs % 10; int res = 0; while(x != 0){ int temp = x % 10; if(res > maxs_1 || (res == maxs_1 && temp > maxs_2)){ return 0; } if(res < mins_1 || (res == mins_1 && temp < mins_2)){ return 0; } x = x / 10; res = res * 10 + temp; } return res; } }
相似題型
題目 | 題解 | 難度等級 |
---|---|---|
整數反轉 | 連結 | 簡單 |
迴文數 | 連結 | 簡單 |
字串轉換整數 (atoi) | 連結 |