13. 罗马数字转整数

作者: 花果山松鼠 | 来源:发表于2018-07-19 15:39 被阅读0次

一、题目原型:

罗马数字包含以下七种字符: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

四、小结

总提交数 提交结果

有其他好的方法请极速留言,非常乐意一起探讨。😄

相关文章

网友评论

  • f2cceb91609f:能否用遍历字符串加switch语句的方法来计算和?判断会出现特殊字符串的字符时(如 V、M等),加上对前一个字符的判断,如判断V是如果前一个字符时I,那么就把当前和的值+3,可以我运行的却不对
    花果山松鼠:@久伴不及情深 不行的、因为特殊字符就只有那几个,你去掉那几个就行了。你看我的第一个思路,就是先将特殊字符串轮一遍,然后再轮其他字符。想加就是了。

本文标题:13. 罗马数字转整数

本文链接:https://www.haomeiwen.com/subject/eqdtmftx.html