package day04;
/*
罗马数字包含以下七种字符: I, V, X, L, C, D 和 M。
1, 5, 10,50,100, 500 1000
I 可以放在 V (5) 和 X (10) 的左边,来表示 4 和 9。
X 可以放在 L (50) 和 C (100) 的左边,来表示 40 和 90。
C 可以放在 D (500) 和 M (1000) 的左边,来表示 400 和 900。
*/
public class RomanToInt {
public static void main(String[] args) {
String s = "IV";//1994-->M 1000 + CM 900 + XC 90 + IV 4
//测试思路1
//int res = romanToInt(s);
//测试思路2
int res = romanToInt02(s);
System.out.println(res);
}
// 1 4 5 9 10 40 50 90 100 400 500 900 1000
//思路1:从后往前扫描字符串,判断所有可能是情况:I、IV、V、IX、X、XL、L、XC、C、 CD、 D、 CM、 M
public static int romanToInt(String s) {
int sum = 0;
//从后往前遍历字符串
for(int i = s.length() - 1; i >= 0;) {
//处理I,因为所有的IV、IX中的I都会被跳过
if (s.charAt(i) == 'I') {
sum += 1;
i -= 1;
continue;
}
//IV
if(s.charAt(i) == 'V' && (i - 1) >= 0 && s.charAt(i - 1) == 'I') {
sum += 4;
i -= 2;
continue;
}
//V
if (s.charAt(i) == 'V' &&(i == 0 || s.charAt(i - 1) != 'I')) {
sum += 5;
i -= 1;
continue;
}
//IX
if(s.charAt(i) == 'X' && (i - 1) >= 0 && s.charAt(i - 1) == 'I') {
sum += 9;
i -= 2;
continue;
}
//X
if (s.charAt(i) == 'X' &&(i == 0 || s.charAt(i - 1) != 'I')) {
sum += 10;
i -= 1;
continue;
}
//XL
if(s.charAt(i) == 'L' && (i - 1) >= 0 && s.charAt(i - 1) == 'X') {
sum += 40;
i -= 2;
continue;
}
//L
if (s.charAt(i) == 'L' &&(i == 0 || s.charAt(i - 1) != 'X')) {
sum += 50;
i -= 1;
continue;
}
//XC
if(s.charAt(i) == 'C' && (i - 1) >= 0 && s.charAt(i - 1) == 'X') {
sum += 90;
i -= 2;
continue;
}
//C
if (s.charAt(i) == 'C' &&(i == 0 || s.charAt(i - 1) != 'X')) {
sum += 100;
i -= 1;
continue;
}
//CD 400
if(s.charAt(i) == 'D' && (i - 1) >= 0 && s.charAt(i - 1) == 'C') {
sum += 400;
i -= 2;
continue;
}
//D 500
if (s.charAt(i) == 'D' &&(i == 0 || s.charAt(i - 1) != 'C')) {
sum += 500;
i -= 1;
continue;
}
//CM
if(s.charAt(i) == 'M' && (i - 1) >= 0 && s.charAt(i - 1) == 'C') {
sum += 900;
i -= 2;
continue;
}
//M
if (s.charAt(i) == 'M' &&(i == 0 || s.charAt(i - 1) != 'C')) {
sum += 1000;
i -= 1;
continue;
}
}
return sum;
}
//思路2:从前往后扫描,小符号在大符号前,做减法;小符号在大符号后做加法--》IV = 5 - 1, VI = 5 + 1,此时需要一个变量记录前一个符号(数值)
public static int romanToInt02(String s) {
int preNum = getValue(s.charAt(0));//记录前一个符号(数值)
int sum = 0;
for(int i = 1; i < s.length(); i++) {
int curNum = getValue(s.charAt(i));
if(preNum < curNum) {//小符号在大符号前,做减法
sum -= preNum;
} else {
sum += preNum;
}
preNum = curNum;
}
//处理最后一个preNum
sum += preNum;
return sum;
}
//根据符号返回相应的数值
public static int getValue(char c){
switch (c) {
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;
}
}
}
罗马数字转整数的两种思路方法及其JAVA代码实现
最新推荐文章于 2022-03-17 19:18:28 发布