Skip to content

Commit 39c0fc0

Browse files
committed
add 013
1 parent c75f181 commit 39c0fc0

File tree

3 files changed

+102
-0
lines changed

3 files changed

+102
-0
lines changed

README.md

+2
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,7 @@
9292
| 412 | [Fizz Buzz][412] |
9393
| 204 | [Count Primes][204] |
9494
| 326 | [Power of Three][326] |
95+
| 13 | [Roman to Integer][013] |
9596

9697

9798
[leetcode]: https://leetcode.com/problemset/all/
@@ -140,3 +141,4 @@
140141
[412]: https://github.com/andavid/leetcode-java/blob/master/note/412/README.md
141142
[204]: https://github.com/andavid/leetcode-java/blob/master/note/204/README.md
142143
[326]: https://github.com/andavid/leetcode-java/blob/master/note/326/README.md
144+
[013]: https://github.com/andavid/leetcode-java/blob/master/note/013/README.md

note/013/README.md

+61
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
# [Roman to Integer][title]
2+
3+
## Description
4+
5+
Given a roman numeral, convert it to an integer.
6+
7+
Input is guaranteed to be within the range from 1 to 3999.
8+
9+
## 思路
10+
11+
罗马数字共有7个,即Ⅰ(1)、Ⅴ(5)、Ⅹ(10)、Ⅼ(50)、Ⅽ(100)、Ⅾ(500)和Ⅿ(1000)。
12+
有以下几个拼写规则:
13+
14+
* 在较大的罗马数字的右边记上较小的罗马数字,表示大数字加小数字。
15+
* 在较大的罗马数字的左边记上较小的罗马数字,表示大数字减小数字。
16+
* 左减的数字有限制,仅限于I、X、C。比如45不可以写成VL,只能是XLV
17+
* 但是,左减时不可跨越一个位值。比如,99不可以用IC( {\displaystyle 100-1} 100-1)表示,而是用XCIX( {\displaystyle [100-10]+[10-1]} [100-10]+[10-1])表示。(等同于阿拉伯数字每位数字分别表示。)
18+
* 左减数字必须为一位,比如8写成VIII,而非IIX。
19+
* 右加数字不可连续超过三位,比如14写成XIV,而非XIIII。
20+
21+
根据以上几个规则,主要是右加左减,可以从右往左扫描字符串,如果遇到 I、X、C 判断是减还是加,如果遇到其他罗马数字,直接累加。
22+
23+
## [完整代码][src]
24+
25+
```java
26+
class Solution {
27+
public int romanToInt(String s) {
28+
int result = 0;
29+
for (int i = s.length() - 1; i >= 0; i--) {
30+
char ch = s.charAt(i);
31+
switch (ch) {
32+
case 'I':
33+
result += (result >= 5) ? -1 : 1;
34+
break;
35+
case 'V':
36+
result += 5;
37+
break;
38+
case 'X':
39+
result += (result >= 50) ? -10 : 10;
40+
break;
41+
case 'L':
42+
result += 50;
43+
break;
44+
case 'C':
45+
result += (result >= 500) ? -100 : 100;
46+
break;
47+
case 'D':
48+
result += 500;
49+
break;
50+
case 'M':
51+
result += 1000;
52+
break;
53+
}
54+
}
55+
return result;
56+
}
57+
}
58+
```
59+
60+
[title]: https://leetcode.com/problems/roman-to-integer
61+
[src]: https://github.com/andavid/leetcode-java/blob/master/src/com/andavid/leetcode/_013/Solution.java
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
class Solution {
2+
public int romanToInt(String s) {
3+
int result = 0;
4+
for (int i = s.length() - 1; i >= 0; i--) {
5+
char ch = s.charAt(i);
6+
switch (ch) {
7+
case 'I':
8+
result += (result >= 5) ? -1 : 1;
9+
break;
10+
case 'V':
11+
result += 5;
12+
break;
13+
case 'X':
14+
result += (result >= 50) ? -10 : 10;
15+
break;
16+
case 'L':
17+
result += 50;
18+
break;
19+
case 'C':
20+
result += (result >= 500) ? -100 : 100;
21+
break;
22+
case 'D':
23+
result += 500;
24+
break;
25+
case 'M':
26+
result += 1000;
27+
break;
28+
}
29+
}
30+
return result;
31+
}
32+
33+
public static void main(String[] args) {
34+
Solution solution = new Solution();
35+
System.out.println(solution.romanToInt("DCXXI"));
36+
System.out.println(solution.romanToInt("XLV"));
37+
System.out.println(solution.romanToInt("MCDXXXVII"));
38+
}
39+
}

0 commit comments

Comments
 (0)