[LeetCode解題攻略] 13. Roman to Integer

更新 發佈閱讀 4 分鐘

在這篇文章中,我們將深入剖析 LeetCode 題目 13. Roman to Integer 的解題方法。這是一道經典題目,要求我們將羅馬數字轉換為整數表示。通過學習這篇教學,你將掌握如何處理羅馬數字的規則和高效地實現轉換。


題目概述

羅馬數字由以下符號組成:

raw-image


規則

  1. 羅馬數字通常由大到小排列,其總值是所有符號的數值之和(例如:XV = 10 + 5 = 15)。
  2. 若較小的符號出現在較大的符號左側,則表示減法(例如:IV = 5 - 1 = 4)。
  3. 若較小的符號出現在較大的符號右側,則表示加法(例如:VI = 5 + 1 = 6)。

範例1:

Input: s = "III"
Output: 3
Explanation: 1 + 1 + 1 = 3

範例2:

Input: s = "LVIII"
Output: 58
Explanation: 50 + 5 + 3 = 58

範例3:

Input: s = "MCMXCIV"
Output: 1994
Explanation: 1000 + 900 + 90 + 4 = 1994

解題思路

要將羅馬數字轉換為整數,我們需要遵循以下步驟:

  1. 建立羅馬數字和整數的對應關係:以字典形式存儲每個羅馬數字的值。
  2. 逐字檢查字符串
    • 若當前字符的值小於下一個字符的值,則視為減法,從總值中減去該字符的值。
    • 否則視為加法,將該字符的值加到總值中。
  3. 遍歷完成後得到最終結果

解法實現

實作 (Python)

class Solution:
def romanToInt(self, s: str) -> int:
# 定義羅馬數字的對應表
roman_to_int = {
'I': 1, 'V': 5, 'X': 10, 'L': 50,
'C': 100, 'D': 500, 'M': 1000
}

total = 0 # 總和
prev_value = 0 # 前一個字符的數值

# 從右向左遍歷字符串
for char in reversed(s):
current_value = roman_to_int[char]

# 判斷是否需要減法
if current_value < prev_value:
total -= current_value
else:
total += current_value

# 更新前一個字符的值
prev_value = current_value

return total

複雜度分析

  • 時間複雜度:O(n)
    我們遍歷字符串一次,其中 n 為字符串長度。
  • 空間複雜度:O(1)
    僅使用固定大小的額外空間來存儲對應表和變量。

總結

本題的解題關鍵在於:

  1. 理解羅馬數字的加減規則。
  2. 利用反向遍歷的方式簡化處理減法的邏輯。
  3. 高效實現轉換過程,時間複雜度為 O(n)。

希望這篇教學能幫助你掌握 Roman to Integer 的解法!

留言
avatar-img
追極光的北極熊|軟體工程師的小天地
14會員
169內容數
歡迎來到我的部落格!這裡記錄了軟體工程師的日常生活點滴,並分享程式設計與演算法的實用教學。無論你是初學者還是有經驗的開發者,都能在這裡找到深入淺出的技術解析與實戰技巧。此外,我也會分享工作中的心路歷程與學習心得,讓你不僅學到技術,更能瞭解軟體開發的實際應用與挑戰。希望透過這個平台,能與你共同成長,激發對技術的熱情!
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
vocus 慶祝推出 App,舉辦 2026 全站慶。推出精選內容與數位商品折扣,訂單免費與紅包抽獎、新註冊會員專屬活動、Boba Boost 贊助抽紅包,以及全站徵文,並邀請你一起來回顧過去的一年, vocus 與創作者共同留下了哪些精彩創作。
Thumbnail
vocus 慶祝推出 App,舉辦 2026 全站慶。推出精選內容與數位商品折扣,訂單免費與紅包抽獎、新註冊會員專屬活動、Boba Boost 贊助抽紅包,以及全站徵文,並邀請你一起來回顧過去的一年, vocus 與創作者共同留下了哪些精彩創作。
Thumbnail
分享一個猜數字的遊戲題目,給予提示讓玩家找出正確的四位數密碼。
Thumbnail
分享一個猜數字的遊戲題目,給予提示讓玩家找出正確的四位數密碼。
Thumbnail
LeetCode 是一個程式語言版的線上題庫平臺,提供題目描述、程式碼區塊、解題者分享的解法和疑問討論。藉由這篇文章分享我在 LeetCode 上的使用經驗和觀點,包括刷題的重要性、解題心態和練習目標。
Thumbnail
LeetCode 是一個程式語言版的線上題庫平臺,提供題目描述、程式碼區塊、解題者分享的解法和疑問討論。藉由這篇文章分享我在 LeetCode 上的使用經驗和觀點,包括刷題的重要性、解題心態和練習目標。
Thumbnail
題目敘述 Patching Array 題目給定一個整數陣列, 請問還要補上多少個數字,才能用這些數字的和拼湊出所有1~n的整數。
Thumbnail
題目敘述 Patching Array 題目給定一個整數陣列, 請問還要補上多少個數字,才能用這些數字的和拼湊出所有1~n的整數。
Thumbnail
題目敘述 題目會給我們一個輸入陣列tokens,裡面以逆序波蘭表達式的方式儲存各個token,請問最後計算完的值是多少? 例如: ["6", "2", "/"] 代表 6 / 2 =3 題目的原文敘述 測試範例 Example 1: Input: tokens = ["2","1"
Thumbnail
題目敘述 題目會給我們一個輸入陣列tokens,裡面以逆序波蘭表達式的方式儲存各個token,請問最後計算完的值是多少? 例如: ["6", "2", "/"] 代表 6 / 2 =3 題目的原文敘述 測試範例 Example 1: Input: tokens = ["2","1"
Thumbnail
題目敘述 題目會給我們一個輸入陣列nums,每個元素值代表那個格子點可以左右位移的固定長度。 例如,假設 nums[i] = 3,那麼下一步可以移動到nums[i-3] 或 nums[i+3]這兩個格子點。 題目​會給定一個起始點start索引位置,請問我們能不能走到內部數值為0的格子點?
Thumbnail
題目敘述 題目會給我們一個輸入陣列nums,每個元素值代表那個格子點可以左右位移的固定長度。 例如,假設 nums[i] = 3,那麼下一步可以移動到nums[i-3] 或 nums[i+3]這兩個格子點。 題目​會給定一個起始點start索引位置,請問我們能不能走到內部數值為0的格子點?
Thumbnail
題目敘述 題目會給定我們兩個字串word1 和 word2。 允許我們不限制次數進行下列兩種操作: 任意調換其中兩個字元的位置。 把字串中的某個字元全部置換成另一個字元,同時把另一個字元同時置換成某個字元。(例如把字串中原本的a都換成b,把原本的b都換成a) 問我們能不能通過上述兩項操作,
Thumbnail
題目敘述 題目會給定我們兩個字串word1 和 word2。 允許我們不限制次數進行下列兩種操作: 任意調換其中兩個字元的位置。 把字串中的某個字元全部置換成另一個字元,同時把另一個字元同時置換成某個字元。(例如把字串中原本的a都換成b,把原本的b都換成a) 問我們能不能通過上述兩項操作,
Thumbnail
題目 : 27. Remove Element
Thumbnail
題目 : 27. Remove Element
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News