-
Notifications
You must be signed in to change notification settings - Fork 0
/
13. Roman to Integer
156 lines (128 loc) · 5.4 KB
/
13. Roman to Integer
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
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
Roman numerals are represented by seven different symbols: I, V, X, L, C, D and M.
Symbol Value
I 1
V 5
X 10
L 50
C 100
D 500
M 1000
For example, 2 is written as II in Roman numeral, just two ones 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.
Example 1:
Input: s = "III"
Output: 3
Explanation: III = 3.
Example 2:
Input: s = "LVIII"
Output: 58
Explanation: L = 50, V= 5, III = 3.
Example 3:
Input: s = "MCMXCIV"
Output: 1994
Explanation: M = 1000, CM = 900, XC = 90 and IV = 4.
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].
罗马数字由七个不同的符号表示:I、V、X、L、C、D 和 M。
符号 值
I 1
V 5
X 10
L 50
C 100
D 500
M 1000
例如,2 用罗马数字表示为 II,即两个一相加。12 被写成 XII,即 X + II。27 被写成 XXVII,即 XX + V + II。
罗马数字通常按照从左到右从大到小的顺序书写。然而,表示数字四的符号不是 IIII。相反,数字四被写成 IV。因为一在五的左边,所以我们将它减去,得到四。同样的原则适用于数字九,它被写成 IX。有六种情况使用减法:
I 可以放在 V (5) 和 X (10) 的左边,来表示 4 和 9。
X 可以放在 L (50) 和 C (100) 的左边,来表示 40 和 90。
C 可以放在 D (500) 和 M (1000) 的左边,来表示 400 和 900。
给定一个罗马数字,将其转换成整数。
示例 1:
输入:s = "III"
输出:3
解释:III = 3。
示例 2:
输入:s = "LVIII"
输出:58
解释:L = 50,V= 5,III = 3。
示例 3:
输入:s = "MCMXCIV"
输出:1994
解释:M = 1000,CM = 900,XC = 90,IV = 4。
提示:
1 <= s.length <= 15
s 仅含字符 ('I', 'V', 'X', 'L', 'C', 'D', 'M')
题目数据保证 s 是一个有效的罗马数字,且表示范围为 [1, 3999]。
class Solution {
public int romanToInt(String s) {
int result = 0; // 初始化结果为0
for(int i=0; i<s.length(); i++) { // 遍历输入字符串中的每个字符
char curr = s.charAt(i); // 获取当前字符
char next = (i+1 < s.length()) ? s.charAt(i+1) : '\0'; // 获取下一个字符,如果下一个字符不存在,则设置为空字符
if(curr == 'I') { // 当前字符为 I
if(next == 'V' || next == 'X') { // 如果下一个字符为 V 或 X,则需要减去 I
result -= 1;
}
else { // 否则,将 I 加到结果中
result += 1;
}
}
else if(curr == 'V') { // 当前字符为 V
result += 5; // 将 V 加到结果中
}
else if(curr == 'X') { // 当前字符为 X
if(next == 'L' || next == 'C') { // 如果下一个字符为 L 或 C,则需要减去 X
result -= 10;
}
else { // 否则,将 X 加到结果中
result += 10;
}
}
else if(curr == 'L') { // 当前字符为 L
result += 50; // 将 L 加到结果中
}
else if(curr == 'C') { // 当前字符为 C
if(next == 'D' || next == 'M') { // 如果下一个字符为 D 或 M,则需要减去 C
result -= 100;
}
else { // 否则,将 C 加到结果中
result += 100;
}
}
else if(curr == 'D') { // 当前字符为 D
result += 500; // 将 D 加到结果中
}
else if(curr == 'M') { // 当前字符为 M
result += 1000; // 将 M 加到结果中
}
}
return result; // 返回最终结果
}
}
best answer:
class Solution {
public int romanToInt(String S) {
int ans = 0, num = 0; // 初始化结果为0,以及用于表示当前字符对应的数字
for (int i = S.length()-1; i >= 0; i--) { // 倒序遍历输入字符串中的每个字符
switch(S.charAt(i)) { // 根据当前字符的值,设置对应的数字
case 'I': num = 1; break;
case 'V': num = 5; break;
case 'X': num = 10; break;
case 'L': num = 50; break;
case 'C': num = 100; break;
case 'D': num = 500; break;
case 'M': num = 1000; break;
}
if (4 * num < ans) ans -= num; // 如果当前字符前面有更大的数字,就需要减去当前数字
else ans += num; // 否则,将当前数字加到结果中
}
return ans; // 返回最终结果
}
}