题目
将罗马数字转整数,罗马数字包含以下七种字符: I, V, X, L,C,D 和 M。
提示
字符 数值
I 1
V 5
X 10
L 50
C 100
D 500
M 1000
在較大的羅馬數字的右邊記上較小的羅馬數字,表示大數字加小數字。
在較大的羅馬數字的左邊記上較小的羅馬數字,表示大數字减小數字
但是,左減時不可跨越一個位值。比如,99不可以用IC(100-1)表示,而是用XCIX([100-10]+[10-1])表示
左減數字必須為一位,比如8寫成VIII,而非IIX。
右加數字不可連續超過三位,比如14寫成XIV,而非XIIII
一、方案一
public int getNum(String s) {
int n = 0;
int num = 0;
int n1 = 0;
while (s.length() > 0) {
switch (s.substring(s.length()-1,s.length())){
case "I":
n=1;
break;
case "V":
n=5;
break;
case "X":
n=10;
break;
case "L":
n=50;
break;
case "C":
n=100;
break;
case "D":
n=500;
break;
case "M":
n=1000;
break;
default:
n=0;
break;
}
if (n1 > n) {
num = num - n;
} else {
num = num + n;
}
n1 = n;
s = s.substring(0,s.length()-1);
}
return num;
}
二、方案二
public int romanToInt(String s) {
int num = getValue(s.charAt(s.length()-1));
int suma = num;
int sum = 0;
for (int i=s.length()-2;i>=0;i--) {
sum = getValue(s.charAt(i));
if (num > sum) {
suma -= sum;
} else {
suma += sum;
}
num = sum;
}
return suma;
}
private int getValue(char ch) {
switch(ch) {
case 'I': return 1;
case 'V': return 5;
case 'X': return 10;
case 'L': return 50;
case 'C': return 100;
case 'D': return 500;
case 'M': return 1000;
default: return 0;
}
}
提示 方案二与方案一相比,耗时缩短一半,内耗也相对减少。
三、方案三
public int romanToInt(String s) {
s = s.replace("IV","a");
s = s.replace("IX","b");
s = s.replace("XL","c");
s = s.replace("XC","d");
s = s.replace("CD","e");
s = s.replace("CM","f");
int sum = 0;
for (int i=0;i<s.length();i++) {
sum+=getValue(s.charAt(i));
}
return sum;
}
private int getValue(char ch) {
switch(ch) {
case 'I': return 1;
case 'V': return 5;
case 'X': return 10;
case 'L': return 50;
case 'C': return 100;
case 'D': return 500;
case 'M': return 1000;
case 'a': return 4;
case 'b': return 9;
case 'c': return 40;
case 'd': return 90;
case 'e': return 400;
case 'f': return 900;
default: return 0;
}
}
提示 方案二与方案三相比,方案二耗时短,内耗也相对减少。
本文介绍了将罗马数字转换为整数的三种不同算法方案:方案一使用字符串处理,逐一解析字符并根据规则计算;方案二通过迭代计算每个字符的值,对比前后字符确定加减;方案三则利用模式替换简化输入。方案二和方案三在效率上优于方案一,尤其方案三通过预处理减少了计算次数。
776

被折叠的 条评论
为什么被折叠?



