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;}