-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy path0013_roman_to_integer.go
57 lines (52 loc) · 1.58 KB
/
0013_roman_to_integer.go
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
// https://leetcode.com/problems/roman-to-integer
//
// 0013. Roman to Integer [Easy]
//
// Roman numerals are represented by seven different symbols: I, V, X, L, C, D
// and M.
//
// For example, 2 is written as II in Roman numeral, just two one's added
// together. 12 is written as XII, which is simply X + II. The number 27 is
// written as XXVII, which is XX + V + II.
//
// Roman numerals are usually written largest to smallest from left to right.
// However, the numeral for four is not IIII. Instead, the number four is
// written as IV. Because the one is before the five we subtract it making four.
// The same principle applies to the number nine, which is written as IX. There
// are six instances where subtraction is used:
//
// I can be placed before V (5) and X (10) to make 4 and 9.
// X can be placed before L (50) and C (100) to make 40 and 90.
// C can be placed before D (500) and M (1000) to make 400 and 900.
//
// Given a roman numeral, convert it to an integer.
//
// Constraints:
//
// 1 <= s.length <= 15
// s contains only the characters ('I', 'V', 'X', 'L', 'C', 'D', 'M').
// It is guaranteed that s is a valid roman numeral in the range [1, 3999].
package leetcode
func RomanToInt(roman string) int {
m := map[rune]int{
'I': 1,
'V': 5,
'X': 10,
'L': 50,
'C': 100,
'D': 500,
'M': 1000,
}
digits := []rune(roman)
l := len(digits)
n := m[digits[l-1]] // start with the last digit (length >= 1).
for i := l - 2; i >= 0; i-- {
curr, next := digits[i], digits[i+1]
if m[curr] < m[next] {
n -= m[digits[i]]
} else {
n += m[digits[i]]
}
}
return n
}