iT邦幫忙

2025 iThome 鐵人賽

DAY 6
0
自我挑戰組

LeetCode 每日任務系列 第 6

LeetCode Day6

  • 分享至 

  • xImage
  •  

7. Reverse Integer

題目:
給定一個 32 位元有號整數 x,請你回傳它的數字「反轉後」的結果。

  • 如果反轉後超出 32-bit 範圍([-2^31, 2^31 - 1]),就回傳 0。
  • 輸入可能是正數或負數。

範例:

  • Example 1:
    Input: x = 123
    Output: 321
  • Example 2:
    Input: x = -123
    Output: -321
  • Example 3:
    Input: x = 120
    Output: 21

想法:
先讀到最後一位,並儲存——>先進先出FIFO

!更正!:
逐位取出最後一位數字,再「推入」新數字的尾端

為什麼?
不是FIFO(Queue),而是做「數學位數運算」
流程如下

  1. 取出最後一位 → pop = x % 10
  2. 去掉最後一位 → x = x / 10
  3. 組裝到新數字 → rev = rev * 10 + pop
    用stack會花費太多空間(需要 O(n) 的空間)程式冗長
    所以不需要「先進後出」或「先進先出」的資料結構

程式碼:

class Solution {
    public int reverse(int x) {
        int rev = 0;
        while (x != 0) {
            int pop = x % 10;   // 取最後一位
            x /= 10;            // 去掉最後一位

            // 檢查是否會超過 int 範圍
            if (rev > Integer.MAX_VALUE / 10 || (rev == Integer.MAX_VALUE / 10 && pop > 7)) {
                return 0;
            }
            if (rev < Integer.MIN_VALUE / 10 || (rev == Integer.MIN_VALUE / 10 && pop < -8)) {
                return 0;
            }

            rev = rev * 10 + pop;  // 把數字推進去
        }
        return rev;
    }
}

溢位判斷
因為 int 最大值 2147483647,最小值 -2147483648,所以:

  • 當 rev > Integer.MAX_VALUE/10 → 下一步一定會溢位
  • 當 rev == Integer.MAX_VALUE/10 && pop > 7 → 也會溢位
  • 當 rev < Integer.MIN_VALUE/10 → 下一步一定會溢位
  • 當 rev == Integer.MIN_VALUE/10 && pop < -8 → 也會溢位

實際操作:

範例一:x = 123

STEP1
x = 123 ——>pop = 3
rev = 0 * 10 + 3 = 3

STEP2
x = 12 ——>pop = 2
rev = 3 * 10 + 2 = 32

STEP3
x = 1 ——>pop = 1
32 * 10 + 1 = 321

STEP4
x = 0 ——>結束
輸出:321

範例二:x = 1534236469
因rev * 10 + pop 會超過 2147483647
因此直接回傳 0


上一篇
LeetCode Day5
下一篇
LeetCode Day7
系列文
LeetCode 每日任務7
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言