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
    

    四、小结

    总提交数 提交结果

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

    相关文章

      网友评论

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

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

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