一、题目原型:
罗马数字包含以下七种字符: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 。
六种特殊字符:IV, IX, XL, XC,CD 和 CM。
特殊字符 数值
IV 4
IX 9
XL 40
XC 90
CD 400
CM 900
二、题目意思剖析:
将罗马数字从后往前依次筛选
1.先筛选出特殊字符,+对应的数值,然后进行剔除
2.在筛选普通字符,+对应的数值,然后进行剔除
最后得出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.
三、解题思路:
// 看起来清晰,然而写起来麻烦。
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
}
// 优化写法
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
四、小结
总提交数 提交结果有其他好的方法请极速留言,非常乐意一起探讨。😄
网友评论