题目描述
罗马数字包含以下七种字符: I, V, X, L,C,D 和 M。
字符 数值 I 1 V 5 X 10 L 50 C 100 D 500 M 1000
例如, 罗马数字 2 写做 II ,即为两个并列的 1。12 写做 XII ,即为 X + II 。 27 写做 XXVII, 即为 XX + V + II 。
通常情况下,罗马数字中小的数字在大的数字的右边。但也存在特例,例如 4 不写做 IIII,而是 IV。数字 1 在数字 5 的左边,所表示的数等于大数 5 减小数 1 得到的数值 4 。同样地,数字 9 表示为 IX。这个特殊的规则只适用于以下六种情况:
I 可以放在 V (5) 和 X (10) 的左边,来表示 4 和 9。
X 可以放在 L (50) 和 C (100) 的左边,来表示 40 和 90。
C 可以放在 D (500) 和 M (1000) 的左边,来表示 400 和 900。
给定一个罗马数字,将其转换成整数。输入确保在 1 到 3999 的范围内。
示例 1:
输入: "III"
输出: 3
示例 2:
输入: "IV"
输出: 4
示例 3:
输入: "IX"
输出: 9
示例 4:
输入: "LVIII"
输出: 58
解释: L = 50, V= 5, III = 3.
示例 5:
输入: "MCMXCIV"
输出: 1994
解释: M = 1000, CM = 900, XC = 90, IV = 4.
解法思路
列出所有情况,大量调用string.replace()方法去修改字符串
示例代码
package easy;
import org.junit.Test;
import java.util.*;
/**
* 罗马数字转整数
*/
public class E13 {
public static int romanToInt(String s) {
int sum =0;
while (s.length()>0){
if (s.contains("IV")){
sum+=4;
s = s.replace("IV","");
}
if (s.contains("IX")){
sum+=9;
s = s.replace("IX","");
}
if (s.contains("III")) {
sum+=3;
s = s.replace("III","");
}
if (s.contains("II")){
sum+=2;
s = s.replace("II","");
}
if (s.contains("I")){
sum+=1;
s = s.replace("I","");
}
if (s.contains("V")){
sum+=5;
s = s.replace("V","");
}
if (s.contains("XL")){
sum+=40;
s = s.replace("XL","");
}
if (s.contains("XC")){
sum+=90;
s = s.replace("XC","");
}
if (s.contains("XXX")){
sum+=30;
s = s.replace("XXX","");
}
if (s.contains("XX")){
sum+=20;
s = s.replace("XX","");
}
if (s.contains("X")){
sum+=10;
s = s.replace("X","");
}
if (s.contains("L")){
sum+=50;
s = s.replace("L","");
}
//100- 900
if (s.contains("CD")){
sum+=400;
s = s.replace("CD","");
}
if (s.contains("CM")){
sum+=900;
s = s.replace("CM","");
}
if (s.contains("CCC")){
sum+=300;
s = s.replace("CCC","");
}
if (s.contains("CC")){
sum+=200;
s = s.replace("CC","");
}
if (s.contains("C")){
sum+=100;
s = s.replace("C","");
}
if (s.contains("D")){
sum+=500;
s = s.replace("D","");
}
if (s.contains("MMM")){
sum+=3000;
s = s.replace("MMM","");
}
if (s.contains("MM")){
sum+=2000;
s = s.replace("MM","");
}
if (s.contains("M")){
sum+=1000;
s = s.replace("M","");
}
}
return sum;
}
public static void main(String[] agrs){
String s = "MMCCCXCIX";
int out = romanToInt(s);
System.out.println(out);
}
}
运行结果
通过
执行结果: 通过 显示详情 执行用时 :27 ms, 在所有 java 提交中击败了28.24% 的用户 内存消耗 :38.9 MB, 在所有 java 提交中击败了85.53%的用户
一个坑
java的String类的replace()方法返回的是一个新的String对象,需要重新赋值回去,否则,s的值不更新
优化思路
加入大量的终结判断
class Solution {
public int romanToInt(String s) {
int sum =0;
while (s.length()>0){
if (s.contains("IV")){
sum+=4;
s = s.replace("IV","");
}else
if (s.contains("IX")){
sum+=9;
s = s.replace("IX","");
}else
if (s.contains("III")) {
sum+=3;
s = s.replace("III","");
}else
if (s.contains("II")){
sum+=2;
s = s.replace("II","");
}else
if (s.contains("I")){
sum+=1;
s = s.replace("I","");
}else
if (s.contains("V")){
sum+=5;
s = s.replace("V","");
}
if (s.contains("XL")){
sum+=40;
s = s.replace("XL","");
}else
if (s.contains("XC")){
sum+=90;
s = s.replace("XC","");
}else
if (s.contains("XXX")){
sum+=30;
s = s.replace("XXX","");
}else
if (s.contains("XX")){
sum+=20;
s = s.replace("XX","");
}else
if (s.contains("X")){
sum+=10;
s = s.replace("X","");
}else
if (s.contains("L")){
sum+=50;
s = s.replace("L","");
}
//100- 900
if (s.contains("CD")){
sum+=400;
s = s.replace("CD","");
}else
if (s.contains("CM")){
sum+=900;
s = s.replace("CM","");
}else
if (s.contains("CCC")){
sum+=300;
s = s.replace("CCC","");
}else
if (s.contains("CC")){
sum+=200;
s = s.replace("CC","");
}else
if (s.contains("C")){
sum+=100;
s = s.replace("C","");
}else
if (s.contains("D")){
sum+=500;
s = s.replace("D","");
}
if (s.contains("MMM")){
sum+=3000;
s = s.replace("MMM","");
}else
if (s.contains("MM")){
sum+=2000;
s = s.replace("MM","");
}else
if (s.contains("M")){
sum+=1000;
s = s.replace("M","");
}
}
return sum;
}
}
执行结果: 通过 显示详情 执行用时 :24 ms, 在所有 java 提交中击败了36.07% 的用户 内存消耗 :39.5 MB, 在所有 java 提交中击败了77.71%的用户