一扫尺、題目原型:
羅馬數(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 寫(xiě)做 II 争便,即為兩個(gè)并列的 1。12 寫(xiě)做 XII 斩启,即為 X + II 兔簇。 27 寫(xiě)做 XXVII, 即為 XX + V + II 边酒。
六種特殊字符:IV墩朦, IX, XL, XC赴背,CD 和 CM。
特殊字符 數(shù)值
IV 4
IX 9
XL 40
XC 90
CD 400
CM 900
二、題目意思剖析:
將羅馬數(shù)字從后往前依次篩選
1.先篩選出特殊字符,+對(duì)應(yīng)的數(shù)值践啄,然后進(jìn)行剔除
2.在篩選普通字符吠裆,+對(duì)應(yīng)的數(shù)值诵棵,然后進(jìn)行剔除
最后得出result嘶窄。
輸入: "III"
輸出: 3
輸入: "IV"
輸出: 4
輸入: "IX"
輸出: 9
輸入: "LVIII"
輸出: 58
解釋: C = 100, L = 50, XXX = 30, III = 3.
輸入: "MCMXCIV"
輸出: 1994
解釋: M = 1000, CM = 900, XC = 90, IV = 4.
三、解題思路:
// 看起來(lái)清晰,然而寫(xiě)起來(lái)麻煩晦攒。
func romanToInt(_ s: String) -> Int {
var sum: Int = 0
var str: String = s
var special: [String] = ["IV","IX","XL","XC","CD","CM"]
for i in 0..<special.count {
if str.contains(special[i]) {
let range: Range<String.Index> = str.range(of: special[i])!
str.removeSubrange(range)
if special[i] == "CM" {
sum = sum + 900
}else if special[i] == "CD" {
sum = sum + 400
}else if special[i] == "XC" {
sum = sum + 90
}else if special[i] == "XL" {
sum = sum + 40
}else if special[i] == "IX" {
sum = sum + 9
}else if special[i] == "IV" {
sum = sum + 4
}
print(str)
print(sum)
}
}
for char in str {
let temp = String.init(char)
if temp == "M" {
sum = sum + 1000
}else if temp == "D" {
sum = sum + 500
}else if temp == "C" {
sum = sum + 100
}else if temp == "L" {
sum = sum + 50
}else if temp == "X" {
sum = sum + 10
}else if temp == "V" {
sum = sum + 5
}else if temp == "I" {
sum = sum + 1
}
}
return sum
}
// 優(yōu)化寫(xiě)法
func romanToInt(_ s: String) -> Int {
var sum: Int = 0
var str: String = s
let specialRoman: [String] = ["IV","IX","XL","XC","CD","CM"]
let specialNum: [Int] = [4, 9, 40, 90, 400, 900]
let normalRoman: [String] = ["M", "D", "C", "L", "X", "V", "I"]
let normalNum: [Int] = [1000, 500, 100, 50, 10, 5, 1]
for i in 0..<specialRoman.count {
while str.contains(specialRoman[i]) {
let range: Range<String.Index> = str.range(of: specialRoman[i])!
str.removeSubrange(range)
sum = sum + specialNum[i]
}
}
for i in 0..<normalNum.count {
while str.contains(normalRoman[i]) {
let range: Range<String.Index> = str.range(of: normalRoman[i])!
str.removeSubrange(range)
sum = sum + normalNum[i]
}
}
return sum
四闽撤、小結(jié)
總提交數(shù)
提交結(jié)果
有其他好的方法請(qǐng)極速留言,非常樂(lè)意一起探討脯颜。??
個(gè)人博客地址