[LeetCode解題攻略] 7. Reverse Integer

更新於 發佈於 閱讀時間約 5 分鐘

這篇文章將解析 LeetCode 題目 7. Reverse Integer,這是一道簡單但容易出錯的數字操作題。題目要求將一個整數反轉後返回,並需考慮邊界條件和溢出情況。讓我們逐步解題,並討論不同的解法。


題目概述

給定一個 32 位整數 x,要求返回將 x 中的數字反轉後的結果。如果反轉後的數字超出 32 位整數的範圍 [-2^31, 2^31 - 1],則返回 0。

示例:

Input: x = 123
Output: 321

Input: x = -123
Output: -321

Input: x = 120
Output: 21

Input: x = 0
Output: 0

思路分析

反轉整數的核心在於數字位的操作,關鍵點包括:

  1. 符號處理:如果是負數,記得保持反轉後的負號。
  2. 溢出檢查:反轉的結果需要保持在 32 位整數範圍內,否則返回 0。
  3. 去除末尾的零:例如,120 反轉後應為 21

解法一:數字反轉 - 使用數學操作

通過數學操作進行反轉,我們可以逐位將數字取出並重新組合:

步驟:

  1. 記錄數字的正負號,將 x 轉為正數。
  2. 使用一個迴圈逐位取出 x 的最右側數字,並將其添加到 rev 的尾部。
  3. 每次將新數字添加到 rev 時,檢查是否超過 32 位整數範圍。
  4. 如果超過範圍,返回 0;否則,返回 rev 的結果。

實作 (Python):

class Solution:
def reverse(self, x: int) -> int:
INT_MAX, INT_MIN = 2**31 - 1, -2**31
rev = 0
sign = -1 if x < 0 else 1
x = abs(x)

while x != 0:
pop = x % 10
x //= 10
# 檢查是否會溢出
if rev > (INT_MAX - pop) // 10:
return 0
rev = rev * 10 + pop

return sign * rev

複雜度分析

  • 時間複雜度:O(log(x)),因為我們按位操作,x 的位數越多,操作次數越多。
  • 空間複雜度:O(1),只使用了固定的變數。

這種方法效率高且內存使用少,適合大多數情況。


解法二:轉換為字串處理

另一種方法是將整數轉換為字串,利用 Python 的字串反轉功能。這樣可以快速完成反轉,但需要處理符號和末尾零。

步驟:

  1. x 轉換為字串,並去除負號。
  2. 使用字串切片反轉字串。
  3. 如果原數為負數,反轉後加上負號。
  4. 檢查結果是否在範圍內,若不在則返回 0。

實作 (Python):

class Solution:
def reverse(self, x: int) -> int:
INT_MAX, INT_MIN = 2**31 - 1, -2**31
sign = -1 if x < 0 else 1
rev_str = str(abs(x))[::-1]
rev = int(rev_str) * sign

if rev < INT_MIN or rev > INT_MAX:
return 0
return rev

複雜度分析

  • 時間複雜度:O(n),n 是整數的位數。
  • 空間複雜度:O(n),需要存儲反轉後的字串。

這種方法簡潔,但佔用較多空間,適合處理 Python 的大整數。


總結

此題主要考察數字處理的基本操作與邊界控制,兩種方法各有優缺點:

  • 數學操作法:效率較高,不需要額外空間。
  • 字串反轉法:簡潔易懂,但空間需求較大。

希望這篇教學能幫助你更好地理解 Reverse Integer 題目的思路與解法!


留言
avatar-img
留言分享你的想法!
avatar-img
追極光的北極熊|軟體工程師的小天地
10會員
162內容數
歡迎來到我的部落格!這裡記錄了軟體工程師的日常生活點滴,並分享程式設計與演算法的實用教學。無論你是初學者還是有經驗的開發者,都能在這裡找到深入淺出的技術解析與實戰技巧。此外,我也會分享工作中的心路歷程與學習心得,讓你不僅學到技術,更能瞭解軟體開發的實際應用與挑戰。希望透過這個平台,能與你共同成長,激發對技術的熱情!
2025/04/04
給定一個非負整數陣列 nums,其中 nums[i] 代表你在索引 i 處最多可以向右跳幾步。 請判斷是否能夠從索引 0 跳到最後一個索引。
2025/04/04
給定一個非負整數陣列 nums,其中 nums[i] 代表你在索引 i 處最多可以向右跳幾步。 請判斷是否能夠從索引 0 跳到最後一個索引。
2025/03/28
給定一個 m x n 的矩陣 matrix,請按照 螺旋順序(spiral order) 返回矩陣中的所有元素。
2025/03/28
給定一個 m x n 的矩陣 matrix,請按照 螺旋順序(spiral order) 返回矩陣中的所有元素。
2025/03/20
這道題是 LeetCode 的經典題之一,要求我們找出 一個子陣列,使其和最大,並返回這個最大和的數值。
2025/03/20
這道題是 LeetCode 的經典題之一,要求我們找出 一個子陣列,使其和最大,並返回這個最大和的數值。
看更多
你可能也想看
Thumbnail
題目敘述: Reverse Bits 給定一個32bit的整數,請逆序翻轉其二進位表達式,輸出翻轉過後的數字。 例如輸入是二進位1010111 逆序翻轉後是 1110101,對應的十進位數值是117 測試範例 Example 1: Input: n = 00000010100101000
Thumbnail
題目敘述: Reverse Bits 給定一個32bit的整數,請逆序翻轉其二進位表達式,輸出翻轉過後的數字。 例如輸入是二進位1010111 逆序翻轉後是 1110101,對應的十進位數值是117 測試範例 Example 1: Input: n = 00000010100101000
Thumbnail
題目 : 69. Sqrt(x)
Thumbnail
題目 : 69. Sqrt(x)
Thumbnail
題目敘述 題目會給我們一個陣列,要求我們返回 兩數之和=target所在的陣列索引值。 題目還額外保證,一定剛好有一組解。 測試範例 Example 1: Input: nums = [2,7,11,15], target = 9 Output: [0,1]
Thumbnail
題目敘述 題目會給我們一個陣列,要求我們返回 兩數之和=target所在的陣列索引值。 題目還額外保證,一定剛好有一組解。 測試範例 Example 1: Input: nums = [2,7,11,15], target = 9 Output: [0,1]
Thumbnail
題目會給我們一個字串陣列nums,內容都是二進位字串,要求我們造出一個另一個相等長度,新的二進位字串,而且不和字串陣列nums內的重複。 答案可能有不只一組,回傳合任一組合法的答案皆可。
Thumbnail
題目會給我們一個字串陣列nums,內容都是二進位字串,要求我們造出一個另一個相等長度,新的二進位字串,而且不和字串陣列nums內的重複。 答案可能有不只一組,回傳合任一組合法的答案皆可。
Thumbnail
題目:您可能知道一些相當大的完全平方數。但是下一個呢?完成 findNextSquare 方法,該方法用於找出參數後的下一個整數完全平方數。回想一下,整數的完全平方數是一個整數n,因此sqrt ( n )也是一個整數。如果參數本身不是完全平方數,則返回 -1 。您可以假定該參數
Thumbnail
題目:您可能知道一些相當大的完全平方數。但是下一個呢?完成 findNextSquare 方法,該方法用於找出參數後的下一個整數完全平方數。回想一下,整數的完全平方數是一個整數n,因此sqrt ( n )也是一個整數。如果參數本身不是完全平方數,則返回 -1 。您可以假定該參數
Thumbnail
題目的輸入會給我們一個串列,要求我們從頭到尾反轉整個串列。 例子: 如果輸入是1 -> 2 -> 3,那麼輸出就是 3 -> 2 -> 1
Thumbnail
題目的輸入會給我們一個串列,要求我們從頭到尾反轉整個串列。 例子: 如果輸入是1 -> 2 -> 3,那麼輸出就是 3 -> 2 -> 1
Thumbnail
之前跳過的題目,回來補完成。 Input: nums = [1,2,3,4,5,6,7], k = 3 Output: [5,6,7,1,2,3,4]
Thumbnail
之前跳過的題目,回來補完成。 Input: nums = [1,2,3,4,5,6,7], k = 3 Output: [5,6,7,1,2,3,4]
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News