13. 罗马数字转整数

一、题目原型:

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

四、小结

总提交数
提交结果

有其他好的方法请极速留言,非常乐意一起探讨。😄
个人博客地址

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容