LeetCode13.羅馬數字轉整數
阿新 • • 發佈:2021-07-25
題目
羅馬數字包含以下七種字元:I,V,X,L,C,D和M。
字元 數值 I 1 V 5 X 10 L 50 C 100 D 500 M 1000 例如, 羅馬數字 2 寫做II,即為兩個並列的 1。12 寫做XII,即為X+II。 27 寫做XXVII, 即為XX+V+II。 通常情況下,羅馬數字中小的數字在大的數字的右邊。但也存在特例,例如 4 不寫做IIII,而是IV。數字 1 在數字 5 的左邊,所表示的數等於大數 5 減小數 1 得到的數值 4 。同樣地,數字 9 表示為IX。這個特殊的規則只適用於以下六種情況: I可以放在V(5) 和X(10) 的左邊,來表示 4 和 9。 X可以放在L(50) 和C(100) 的左邊,來表示 40 和90。 C可以放在D(500) 和M(1000) 的左邊,來表示400 和900。 給定一個羅馬數字,將其轉換成整數。輸入確保在 1到 3999 的範圍內。 示例1: 輸入:"III" 輸出: 3 示例2: 輸入:"IV" 輸出: 4 示例3: 輸入:"IX" 輸出: 9 示例4: 輸入:"LVIII" 輸出: 58 解釋: L = 50, V= 5, III = 3. 示例5: 輸入:"MCMXCIV" 輸出: 1994 解釋: M = 1000, CM = 900, XC = 90, IV = 4.
提示:
1 <= s.length <= 15
s 僅含字元 ('I', 'V', 'X', 'L', 'C', 'D', 'M')
題目資料保證 s 是一個有效的羅馬數字,且表示整數在範圍 [1, 3999] 內
題目所給測試用例皆符合羅馬數字書寫規則,不會出現跨位等情況。
IL 和 IM 這樣的例子並不符合題目要求,49 應該寫作 XLIX,999 應該寫作 CMXCIX 。
關於羅馬數字的詳盡書寫規則,可以參考 羅馬數字 - Mathematics 。
來源:力扣(LeetCode)
連結:https://leetcode-cn.com/problems/roman-to-integer
著作權歸領釦網路所有。商業轉載請聯絡官方授權,非商業轉載請註明出處。
解題方法
模擬
時間複雜度O(n) n為字串長度 空間複雜度O(1)
具體思路見程式碼註釋
程式碼
var romanValues = map[byte]int{'I':1,'V':5,'X':10,'L':50,'C':100,'D':500,'M':1000} // 模擬 func romanToInt(s string) (res int) { // 字串長度 n := len(s) // 遍歷字串 for i := range s{ // 當前羅馬數字對應值 value := romanValues[s[i]] // 當前羅馬數字不是最後一個且小於後一個羅馬數 -=,否則 += if i < n-1 && value < romanValues[s[i+1]]{ res -= value }else{ res += value } } return } // 寫法二 從後往前遍歷 func romanToInt2(s string) (res int) { // 最後一位羅馬數對應數值 res = romanValues[s[len(s)-1]] // 從後往前遍歷 for i := len(s)-1;i > 0;i--{ // 當前遍歷羅馬的前一位羅馬數對應值 perNum := romanValues[s[i-1]] // 如果前一位羅馬小於當前羅馬數值 -= 否則 += if perNum < romanValues[s[i]]{ res -= perNum }else{ res += perNum } } return }