一、題目
羅馬數(shù)字包含以下七種字符: I塑娇, V澈侠, X, L钝吮,C埋涧,D 和 M杜跷。
字符 數(shù)值
I 1
V 5
X 10
L 50
C 100
D 500
M 1000
例如紊撕, 羅馬數(shù)字 2 寫做 II 谴餐,即為兩個并列的 1云稚。12 寫做 XII 伦乔,即為 X + II 杠步。 27 寫做 XXVII, 即為 XX + V + II 扰柠。
通常情況下高职,羅馬數(shù)字中小的數(shù)字在大的數(shù)字的右邊次坡。但也存在特例呼猪,例如 4 不寫做 IIII,而是 IV砸琅。數(shù)字 1 在數(shù)字 5 的左邊宋距,所表示的數(shù)等于大數(shù) 5 減小數(shù) 1 得到的數(shù)值 4 。同樣地症脂,數(shù)字 9 表示為 IX谚赎。這個特殊的規(guī)則只適用于以下六種情況:
I 可以放在 V (5) 和 X (10) 的左邊,來表示 4 和 9诱篷。
X 可以放在 L (50) 和 C (100) 的左邊壶唤,來表示 40 和 90。
C 可以放在 D (500) 和 M (1000) 的左邊棕所,來表示 400 和 900闸盔。
給定一個羅馬數(shù)字,將其轉(zhuǎn)換成整數(shù)琳省。輸入確保在 1 到 3999 的范圍內(nèi)迎吵。
示例 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.
二躲撰、解題
方法和12.整數(shù)轉(zhuǎn)羅馬數(shù)字類似直接暴力窮舉即可,時間復(fù)雜度為O(n),空間復(fù)雜度為O(1)钓觉。
三茴肥、代碼實現(xiàn)
class Solution {
func romanToInt(_ s: String) -> Int {
var str = s
var num = 0
let nums = [1000,900,500,400,100,90,50,40,10,9,5,4,1]
let romans = ["M","CM","D","CD","C","XC","L","XL","X","IX","V","IV","I"]
var i = 0
while str.count > 0 {
let roman = romans[i]
// 此處雖然有一個while循環(huán),但是romans是固定的荡灾,不隨n的變化而變化,所以時間復(fù)雜度依然是O(n)
while str.hasPrefix(roman) {
str.remove(at: str.startIndex)
if roman.count == 2 {
str.remove(at: str.startIndex)
}
num += nums[i]
}
i += 1
}
return num
}
}
Demo地址:github