File tree 3 files changed +102
-0
lines changed
src/com/andavid/leetcode/_013
3 files changed +102
-0
lines changed Original file line number Diff line number Diff line change 92
92
| 412 | [ Fizz Buzz] [ 412 ] |
93
93
| 204 | [ Count Primes] [ 204 ] |
94
94
| 326 | [ Power of Three] [ 326 ] |
95
+ | 13 | [ Roman to Integer] [ 013 ] |
95
96
96
97
97
98
[ leetcode ] : https://leetcode.com/problemset/all/
140
141
[ 412 ] : https://github.com/andavid/leetcode-java/blob/master/note/412/README.md
141
142
[ 204 ] : https://github.com/andavid/leetcode-java/blob/master/note/204/README.md
142
143
[ 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
Original file line number Diff line number Diff line change
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 number Diff line number Diff line change
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
+ }
You can’t perform that action at this time.
0 commit comments