罗马数字与阿拉伯数字之间的简单转换方法,首先需要了解罗马数字计数法,在这两道转换题里我们只用到了前三项规则
罗马数字共有7个,即I(1)、V(5)、X(10)、L(50)、C(100)、D(500)和M(1000)
右加左减: 较大的罗马数字的右边记上较小的罗马数字,表示大数字加小数字; 较大的罗马数字的左边记上较小的罗马数字,表示大数字减小数字
- 左减有一定限制: 只有I, X, C可以放到左边当做减数使用,而且左减不能越位,I的右边只能是VX, X右边只能是LC, C的右边只能是DM; 左减数字必须为一位
- 其他规则: 加线乘千、重复数次、右加数字不可连续超过三位、同一数码最多只能连续出现三次
Roman to Integer
解题思路: 对于每一个roman字符,除了I,X,C三种情况会出现减去对应数值,其他情况都是加上该字符对应的数值; 针对I、X、C,我们可以总结发现只需要考察他们的下一位是否满足减的条件,是则减,否则加。
public class Solution {
public int romanToInt(String s) {
int res = 0;
int len = s.length();
for (int i=0; i<len; i++) {
char tmp = s.charAt(i);
switch (tmp) {
case 'I':
if (i+1 <len && (s.charAt(i+1) == 'V' || s.charAt(i+1) == 'X')) {
res -= 1;
break;
}
res += 1;
break;
case 'V':
res += 5;
break;
case 'X':
if (i+1 <len && (s.charAt(i+1) == 'L' || s.charAt(i+1) == 'C')) {
res -= 10;
break;
}
res += 10;
break;
case 'L':
res += 50;
break;
case 'C':
if (i+1 <len && (s.charAt(i+1) == 'D' || s.charAt(i+1) == 'M')) {
res -= 100;
break;
}
res += 100;
break;
case 'D':
res += 500;
break;
case 'M':
res += 1000;
break;
default:
break;
}
}
return res;
}
}
Integer To Roman
解题思路: 对于输入的数值进行取商处理,从大的计数单位到小的计数单位依次取商, 商则是该计数单位对应的roman字符的个数。
public class Solution {
public String intToRoman(int num) {
// igr存储的是从大到小每一个基本计数单位,与roman一一对应
String[] roman = {"M", "CM", "D", "CD", "C", "XC", "L", "XL", "X", "IX", "V", "IV", "I"};
int[] igr = {1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1};
StringBuilder res = new StringBuilder();
for (int i=0; i<roman.length; i++) {
int quotient = num / igr[i];
for (int j=0; j<quotient; j++) {
res.append(roman[i]);
}
num -= quotient * igr[i];
}
return res.toString();
}
}