1. 程式人生 > 資訊 >線上課程 20 元 / 課時 / 人,上海釋出學科類校外培訓收費管理辦法和定價標準

線上課程 20 元 / 課時 / 人,上海釋出學科類校外培訓收費管理辦法和定價標準

題目來源

7. 整數反轉

題目詳情

給你一個 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

題解分析

  1. 本題是模擬題,本質是考察最大正整數和最小負整數的轉換。
  2. 其實,將數字進行翻轉是很容的,只需要每次使用除餘和除法進行取尾數並累積即可。
  3. 本題的困難是不能單純使用上面的步驟來翻轉數字,因為翻轉後的結果可能大於最大整數,但是又不能使用long來儲存臨時結果,所以我們得想辦法來判斷一個結果是否大於最大整數。
  4. 一開始,我想使用String的compareTo方法來比較轉換為字串後的整數,但是這種方法只能用於比較相同長度的字串,一旦數字相差很大則比較會錯誤。
  5. 本題可以考慮最大整數的特點,如下所示:

    從上圖可以看到,我們可以在迴圈的過程中判斷字首是否大於32位整數的最大字首,如果大於則表示結果肯定大於32位整數;接著,如果倒數第二位字首相同,則判斷最後一位數字,如果大於也表示超出範圍。
  6. 負數也是一樣的,如下圖所示:
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) 連結

結果展示

Either Excellent or Rusty