【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 } }
回答例
課金しないと見れない…
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 } }
遅くなった。
これが早いらしい。
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 } }
感想
どうやればパフォーマンスを改善できるのかわからない