LeetCode: 罗马数字转整数
一、题目描述
二、分析
方法一:
将给定字符串s中的"IV", “IX”, “XL”, “XC”, “CD”, “CM” 全部替换为其他字符如:a, b, c, d, e, f 这种,然后就可以遍历累加了。
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");
方法二:
按照题目的描述,可以总结如下规则:
- 罗马数字由 I,V,X,L,C,D,M 构成;
- 当小值在大值的左边,则减小值,如 IV=5-1=4;
- 当小值在大值的右边,则加小值,如 VI=5+1=6;
- 由上可知,右值永远为正,因此最后一位必然为正。
在代码实现上,可以往后看多一位,对比当前位与后一位的大小关系,从而确定当前位是加还是减法。当没有下一位时,做加法即可。
也可保留当前位的值,当遍历到下一位的时,对比保留值与遍历位的大小关系,再确定保留值为加还是减。最后一位做加法即可。
三、上代码
方法一代码如下:
public static int solution2(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");
//System.out.println("1111" + s);
int result = 0;
for (int i = 0; i < s.length(); i++) {
int num = getInt2(s.charAt(i));
result += num;
}
return result;
}
public static int getInt2(char x) {
switch (x) {
case 'a': return 4;
case 'b': return 9;
case 'c': return 40;
case 'd': return 90;
case 'e': return 400;
case 'f': return 900;
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 solution1(String s) {
int result = 0;
int pre = getInt1(s.charAt(0));
for (int i = 1; i < s.length(); i++) {
int num = getInt1(s.charAt(i));
if (pre < num) {
result -= pre;
} else {
result += pre;
}
pre = num;
}
result += pre;
return result;
}
public int getInt1(char x) {
switch (x) {
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) {
int result = 0;
for (int i = 0; i < s.length();) {
if (s.charAt(i) == 'M') {
result = result + 1000;
i++;
} else if (s.charAt(i) == 'D') {
result = result + 500;
i++;
} else if (s.charAt(i) == 'C') {
if ((i + 1 <= s.length() - 1) && s.charAt(i+1) == 'D') {
result = result + 400;
i = i + 2;
} else if ((i + 1 <= s.length() - 1) && s.charAt(i+1) == 'M') {
result = result + 900;
i = i + 2;
} else {
result = result + 100;
i++;
}
} else if (s.charAt(i) == 'L') {
result = result + 50;
i++;
} else if (s.charAt(i) == 'X') {
if ((i + 1 <= s.length() - 1) && s.charAt(i+1) == 'L') {
result = result + 40;
i = i + 2;
} else if ((i + 1 <= s.length() - 1) && s.charAt(i+1) == 'C') {
result = result + 90;
i = i + 2;
} else {
result = result + 10;
i++;
}
} else if (s.charAt(i) == 'V') {
result = result + 5;
i++;
} else if (s.charAt(i) == 'I') {
if ((i + 1 <= s.length() - 1) && s.charAt(i+1) == 'V') {
result = result + 4;
i = i + 2;
} else if ((i + 1 <= s.length() - 1) && s.charAt(i+1) == 'X') {
result = result + 9;
i = i + 2;
} else {
result = result + 1;
i++;
}
}
}
return result;
}