LeetCode Link: https://leetcode.com/problems/roman-to-integer/
Description:
羅馬數(shù)字包含以下七種字符: I碉钠, V忿檩, X娩怎, L,C窍育,D 和 M。
Symbol Value
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)。
Example:
Input: "III"
Output: 3
Input: "IV"
Output: 4
Input: "IX"
Output: 9
Input: "LVIII"
Output: 58
Explanation: L = 50, V= 5, III = 3.
Input: "MCMXCIV"
Output: 1994
Explanation: M = 1000, CM = 900, XC = 90 and IV = 4.
Tints:
1.羅馬符號轉(zhuǎn)數(shù)字的本質(zhì)是:需要比較左邊和右邊符號代表的數(shù)值的大小口予。如果左邊的大于右邊的娄周,加上左邊的數(shù),如果左邊的小于右邊的沪停,減去左邊的數(shù)煤辨。最后一個符號無法比較裳涛,再加上最后一位。
IV = [1, 5]
num = -1+5 = 4
MCMXCIV = [1000, 100, 1000, 10, 1, 5]
num = +1000-100+1000+10-1+5 = 1994
2.將給定的羅馬字符串map成Int類型的數(shù)組众辨,對于數(shù)組索引值為index的元素端三,再通過比較Array[index]與Array[index+1]的大小決定是加還是減。
Solution:
import Foundation
func romanToInt(_ s: String) -> Int {
let sArray = s.map { (character) -> Int in
switch character {
case "I": return 1
case "V": return 5
case "X": return 10
case "L": return 50
case "C": return 100
case "D": return 500
case "M": return 1000
default:
return 0
}
}
var num = 0
var index = 0
while index < sArray.count - 1 {
if sArray[index] < sArray[index + 1] {
num -= sArray[index]
}else {
num += sArray[index]
}
index += 1
}
return num + sArray[index]
}