-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathContents.swift
86 lines (81 loc) · 2.14 KB
/
Contents.swift
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
//: # Integer to Roman
//: **Question:** Given an integer, convert it to a roman numeral.
let romanNumbers = [(1000, "M"), (900, "CM"), (500, "D"), (400, "CD"), (100,"C"), (90,"XC"), (50, "L"), (40, "XL"), (10, "X"), (9, "IX"), (5, "V"), (4, "IV"), (1, "I")]
func intToRoman(_ num: Int) -> String {
var number = num
var result = ""
var idx = 0
while number > 0 {
if number - romanNumbers[idx].0 >= 0 {
result += romanNumbers[idx].1
number -= romanNumbers[idx].0
} else {
idx += 1
}
}
return result
}
intToRoman(2017)
intToRoman(9)
intToRoman(549)
//: # Roman to Integer
//: **Question:** Given an roman number, convert it to an integer.
func romanToInt(_ roman: String) -> Int {
var current = roman[roman.startIndex..<roman.endIndex]
var idx = 0
var number = 0
while !current.isEmpty {
let (delta, prefix) = romanNumbers[idx]
while current.starts(with: prefix) {
number += delta
current = current.dropFirst(prefix.count)
}
idx += 1
}
return number
}
//: We can do this even with a better runtime.
func value(char: Character) -> Int {
switch char {
case "M":
return 1000
case "D":
return 500
case "C":
return 100
case "L":
return 50
case "X":
return 10
case "V":
return 5
case "I":
return 1
default:
return -1
}
}
func romanToInt2(_ roman: String) -> Int {
var result = 0
var next = roman.startIndex
while next != roman.endIndex {
let valueNext = value(char: roman[next])
let next2 = roman.index(after: next)
if next2 != roman.endIndex {
let valueNext2 = value(char: roman[next2])
if valueNext >= valueNext2 {
result += valueNext
next = next2
} else {
result += valueNext2 - valueNext
next = roman.index(after: next2)
}
} else {
result += valueNext
next = next2
}
}
return result
}
romanToInt2("DXL")
romanToInt2("DXLIX")