Skip to content

Commit 3794871

Browse files
author
wangpeng
committed
feat(EASY): _13_romanToInt
1 parent 20f3385 commit 3794871

File tree

2 files changed

+100
-3
lines changed

2 files changed

+100
-3
lines changed

src/pp/arithmetic/leetcode/_12_intToRoman.java

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@
4646
* 输出: "MCMXCIV"
4747
* 解释: M = 1000, CM = 900, XC = 90, IV = 4.
4848
*
49-
* @see <a href="https://leetcode-cn.com/problems/integer-to-roman/"></a>
49+
* @see <a href="https://leetcode-cn.com/problems/integer-to-roman/">integer-to-roman</a>
5050
*/
5151
public class _12_intToRoman {
5252

@@ -68,11 +68,10 @@ public static void main(String[] args) {
6868
* 解题思路:
6969
* 1、将待转换的数字拆分成个十百千
7070
* 2、逐步求解各位对应的罗马数字
71-
* 解题过程略显麻烦,但是这是基本的解题过程,可以抽象一下,见解法二
71+
* 解题过程略显麻烦,但是这是基本的解题过程,可以抽象一下,见解法二{@link _12_intToRoman#intToRoman2(int)}
7272
*
7373
* @param num
7474
* @return
75-
* @see _12_intToRoman#intToRoman2(int)
7675
*/
7776
public String intToRoman(int num) {
7877
StringBuilder builder = new StringBuilder();
@@ -158,6 +157,9 @@ public String intToRoman(int num) {
158157
* C 100
159158
* D 500
160159
* M 1000
160+
* <p>
161+
* 执行用时 : 21 ms, 在Integer to Roman的Java提交中击败了100.00% 的用户
162+
* 内存消耗 : 40.8 MB, 在Integer to Roman的Java提交中击败了65.63% 的用户
161163
*
162164
* @param num
163165
* @return
Lines changed: 95 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,95 @@
1+
package pp.arithmetic.leetcode;
2+
3+
import javax.swing.plaf.TextUI;
4+
5+
/**
6+
* Created by wangpeng on 2019-04-08.
7+
* 13. 罗马数字转整数
8+
* <p>
9+
* 罗马数字包含以下七种字符: I, V, X, L,C,D 和 M。
10+
* <p>
11+
* 字符 数值
12+
* I 1
13+
* V 5
14+
* X 10
15+
* L 50
16+
* C 100
17+
* D 500
18+
* M 1000
19+
* 例如, 罗马数字 2 写做 II ,即为两个并列的 1。12 写做 XII ,即为 X + II 。 27 写做 XXVII, 即为 XX + V + II 。
20+
* <p>
21+
* 通常情况下,罗马数字中小的数字在大的数字的右边。但也存在特例,例如 4 不写做 IIII,而是 IV。数字 1 在数字 5 的左边,所表示的数等于大数 5 减小数 1 得到的数值 4 。同样地,数字 9 表示为 IX。这个特殊的规则只适用于以下六种情况:
22+
* <p>
23+
* I 可以放在 V (5) 和 X (10) 的左边,来表示 4 和 9。
24+
* X 可以放在 L (50) 和 C (100) 的左边,来表示 40 和 90。
25+
* C 可以放在 D (500) 和 M (1000) 的左边,来表示 400 和 900。
26+
* 给定一个罗马数字,将其转换成整数。输入确保在 1 到 3999 的范围内。
27+
* <p>
28+
* 示例 1:
29+
* <p>
30+
* 输入: "III"
31+
* 输出: 3
32+
* 示例 2:
33+
* <p>
34+
* 输入: "IV"
35+
* 输出: 4
36+
* 示例 3:
37+
* <p>
38+
* 输入: "IX"
39+
* 输出: 9
40+
* 示例 4:
41+
* <p>
42+
* 输入: "LVIII"
43+
* 输出: 58
44+
* 解释: L = 50, V= 5, III = 3.
45+
* 示例 5:
46+
* <p>
47+
* 输入: "MCMXCIV"
48+
* 输出: 1994
49+
* 解释: M = 1000, CM = 900, XC = 90, IV = 4.
50+
*
51+
* @see <a href="https://leetcode-cn.com/problems/roman-to-integer/">roman-to-integer</a>
52+
*/
53+
public class _13_romanToInt {
54+
55+
public static void main(String[] args) {
56+
_13_romanToInt romanToInt = new _13_romanToInt();
57+
System.out.println(romanToInt.romanToInt("III"));
58+
System.out.println(romanToInt.romanToInt("IV"));
59+
System.out.println(romanToInt.romanToInt("IX"));
60+
System.out.println(romanToInt.romanToInt("LVIII"));
61+
System.out.println(romanToInt.romanToInt("MCMXCIV"));
62+
}
63+
64+
/**
65+
* 解题思路:
66+
* 借鉴 {@link _12_intToRoman#intToRoman2(int) } 中的数组替换的思想,反向求对于数字
67+
* <p>
68+
* 执行用时 : 26 ms, 在Roman to Integer的Java提交中击败了100.00% 的用户
69+
* 内存消耗 : 44 MB, 在Roman to Integer的Java提交中击败了65.57% 的用户
70+
*
71+
* @param s
72+
* @return
73+
*/
74+
public int romanToInt(String s) {
75+
int retNum = 0;
76+
String[] romanStrs = new String[]{"M", "CM", "D", "CD", "C", "XC", "L", "XL", "X", "IX", "V", "IV", "I"};
77+
int[] romanInts = new int[]{1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1};
78+
int startI = 0, index = 0;
79+
while (startI < s.length() && index < romanStrs.length) {
80+
int romanLen = romanStrs[index].length();
81+
if (startI + romanLen > s.length()) {
82+
index++;
83+
continue;
84+
}
85+
while (startI < s.length() && startI + romanLen <= s.length()
86+
&& romanStrs[index].equals(s.substring(startI, startI + romanLen))) {
87+
retNum += romanInts[index];
88+
startI += romanLen;
89+
}
90+
index++;
91+
}
92+
93+
return retNum;
94+
}
95+
}

0 commit comments

Comments
 (0)