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

更新於 2024/12/10閱讀時間約 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 的解法!

歡迎來到我的部落格!這裡記錄了軟體工程師的日常生活點滴,並分享程式設計與演算法的實用教學。無論你是初學者還是有經驗的開發者,都能在這裡找到深入淺出的技術解析與實戰技巧。此外,我也會分享工作中的心路歷程與學習心得,讓你不僅學到技術,更能瞭解軟體開發的實際應用與挑戰。希望透過這個平台,能與你共同成長,激發對技術的熱情!
留言0
查看全部
avatar-img
發表第一個留言支持創作者!
在這篇文章中,我們將探討 LeetCode 題目 12. Integer to Roman 的解題方法。這是一道經典的模擬題,要求我們將整數轉換為羅馬數字表示。通過這篇文章,你將學會如何高效地解決這道題,並理解羅馬數字的基本規則和轉換技巧。
這篇文章將介紹 LeetCode 題目 11. Container With Most Water。這是一道經典的雙指針問題,題目要求我們找到容器可以盛最多水的情況,並幫助我們理解如何通過移動左右指針來最大化結果。
這篇文章將介紹 LeetCode 題目 10. Regular Expression Matching,這是一道有趣且具有挑戰性的動態規劃題目,涉及實現一個正則表達式匹配算法。這道題目主要考察對正則表達式中的特殊字符 . 和 * 的理解和處理,並運用動態規劃進行高效求解。
這篇文章將介紹 LeetCode 題目 9. Palindrome Number,這是一道簡單但經典的數字題,目標是判斷給定的整數是否為回文數。這道題目可以幫助我們理解數字操作以及回文判斷的基礎邏輯。
這篇文章將介紹 LeetCode 題目 8. String to Integer (atoi),這是一道實現 atoi 函數的題目。此題的核心在於如何解析字串中的數字並轉換成整數,同時需要考慮各種特殊情況和邊界條件。
這篇文章將解析 LeetCode 題目 7. Reverse Integer,這是一道簡單但容易出錯的數字操作題。題目要求將一個整數反轉後返回,並需考慮邊界條件和溢出情況。讓我們逐步解題,並討論不同的解法。
在這篇文章中,我們將探討 LeetCode 題目 12. Integer to Roman 的解題方法。這是一道經典的模擬題,要求我們將整數轉換為羅馬數字表示。通過這篇文章,你將學會如何高效地解決這道題,並理解羅馬數字的基本規則和轉換技巧。
這篇文章將介紹 LeetCode 題目 11. Container With Most Water。這是一道經典的雙指針問題,題目要求我們找到容器可以盛最多水的情況,並幫助我們理解如何通過移動左右指針來最大化結果。
這篇文章將介紹 LeetCode 題目 10. Regular Expression Matching,這是一道有趣且具有挑戰性的動態規劃題目,涉及實現一個正則表達式匹配算法。這道題目主要考察對正則表達式中的特殊字符 . 和 * 的理解和處理,並運用動態規劃進行高效求解。
這篇文章將介紹 LeetCode 題目 9. Palindrome Number,這是一道簡單但經典的數字題,目標是判斷給定的整數是否為回文數。這道題目可以幫助我們理解數字操作以及回文判斷的基礎邏輯。
這篇文章將介紹 LeetCode 題目 8. String to Integer (atoi),這是一道實現 atoi 函數的題目。此題的核心在於如何解析字串中的數字並轉換成整數,同時需要考慮各種特殊情況和邊界條件。
這篇文章將解析 LeetCode 題目 7. Reverse Integer,這是一道簡單但容易出錯的數字操作題。題目要求將一個整數反轉後返回,並需考慮邊界條件和溢出情況。讓我們逐步解題,並討論不同的解法。
你可能也想看
Google News 追蹤
Thumbnail
本文探討了複利效應的重要性,並藉由巴菲特的投資理念,說明如何選擇穩定產生正報酬的資產及長期持有的核心理念。透過定期定額的投資方式,不僅能減少情緒影響,還能持續參與全球股市的發展。此外,文中介紹了使用國泰 Cube App 的便利性及低手續費,幫助投資者簡化投資流程,達成長期穩定增長的財務目標。
Thumbnail
分享一個猜數字的遊戲題目,給予提示讓玩家找出正確的四位數密碼。
Thumbnail
LeetCode 是一個程式語言版的線上題庫平臺,提供題目描述、程式碼區塊、解題者分享的解法和疑問討論。藉由這篇文章分享我在 LeetCode 上的使用經驗和觀點,包括刷題的重要性、解題心態和練習目標。
Thumbnail
題目敘述 Patching Array 題目給定一個整數陣列, 請問還要補上多少個數字,才能用這些數字的和拼湊出所有1~n的整數。
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
題目敘述 題目會給定我們兩個字串word1 和 word2。 允許我們不限制次數進行下列兩種操作: 任意調換其中兩個字元的位置。 把字串中的某個字元全部置換成另一個字元,同時把另一個字元同時置換成某個字元。(例如把字串中原本的a都換成b,把原本的b都換成a) 問我們能不能通過上述兩項操作,
Thumbnail
本文探討了複利效應的重要性,並藉由巴菲特的投資理念,說明如何選擇穩定產生正報酬的資產及長期持有的核心理念。透過定期定額的投資方式,不僅能減少情緒影響,還能持續參與全球股市的發展。此外,文中介紹了使用國泰 Cube App 的便利性及低手續費,幫助投資者簡化投資流程,達成長期穩定增長的財務目標。
Thumbnail
分享一個猜數字的遊戲題目,給予提示讓玩家找出正確的四位數密碼。
Thumbnail
LeetCode 是一個程式語言版的線上題庫平臺,提供題目描述、程式碼區塊、解題者分享的解法和疑問討論。藉由這篇文章分享我在 LeetCode 上的使用經驗和觀點,包括刷題的重要性、解題心態和練習目標。
Thumbnail
題目敘述 Patching Array 題目給定一個整數陣列, 請問還要補上多少個數字,才能用這些數字的和拼湊出所有1~n的整數。
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
題目敘述 題目會給定我們兩個字串word1 和 word2。 允許我們不限制次數進行下列兩種操作: 任意調換其中兩個字元的位置。 把字串中的某個字元全部置換成另一個字元,同時把另一個字元同時置換成某個字元。(例如把字串中原本的a都換成b,把原本的b都換成a) 問我們能不能通過上述兩項操作,