【LeetCode】Easy: Roman to Integer

Roman to Integer

https://leetcode.com/problems/roman-to-integer/

自分の回答

class Solution {
    func romanToInt(_ s: String) -> Int {
        var output: Int = 0
        var s: String = s

        while !s.isEmpty {
            let firstTwo = s.prefix(2)
            switch firstTwo {
            case "IV":
                output += 4
                s.removeFirst(2)
            case "IX":
                output += 9
                s.removeFirst(2)
            case "XL":
                output += 40
                s.removeFirst(2)
            case "XC":
                output += 90
                s.removeFirst(2)
            case "CD":
                output += 400
                s.removeFirst(2)
            case "CM":
                output += 900
                s.removeFirst(2)
            default:
                switch firstTwo.first {
                case "I":
                    output += 1
                    s.removeFirst(1)
                case "V":
                    output += 5
                    s.removeFirst(1)
                case "X":
                    output += 10
                    s.removeFirst(1)
                case "L":
                    output += 50
                    s.removeFirst(1)
                case "C":
                    output += 100
                    s.removeFirst(1)
                case "D":
                    output += 500
                    s.removeFirst(1)
                case "M":
                    output += 1000
                    s.removeFirst(1)
                default:
                    break
                }
            }
        }
        return output
    }
}

f:id:hira22_1:20200609065958p:plain

回答例

課金しないと見れない…

https://leetcode.com/problems/roman-to-integer/solution/

Discussion のコードを見て修正

class Solution {
    let dic: [String.Element: Int] = [
        "I": 1,
        "V": 5,
        "X": 10,
        "L": 50,
        "C": 100,
        "D": 500,
        "M": 1000
    ]
    
    func romanToInt(_ s: String) -> Int {
        var output: Int = 0
        let arrayed = Array(s)
        for (i, sequence) in arrayed.enumerated() {
            let num: Int = dic[sequence]!
            if i < arrayed.count - 1, num < dic[arrayed[i + 1]]! {
                output -= num
                continue
            }
            output += num
        }
        return output
    }
}

f:id:hira22_1:20200609070702p:plain

遅くなった。

これが早いらしい。

class Solution {
    let numerals: [Character:Int] =
        ["I": 1,
         "V": 5,
         "X": 10,
         "L": 50,
         "C": 100,
         "D": 500,
         "M": 1000
    ]
    
    func romanToInt(_ s: String) -> Int {
        let array = Array(s)
        var i = 0
        var num = 0
        
        while i < array.count - 1 {
            
            let val = numerals[array[i]]!
            let next = numerals[array[i+1]]!
            num += (val < next) ? -val : val
            
            i += 1
        }
        num += numerals[array.last!]!
        
        return num
    }
}

感想

どうやればパフォーマンスを改善できるのかわからない

参考

https://leetcode.com/problems/roman-to-integer/discuss/?currentPage=1&orderBy=most_relevant&query=swift