背景:罗马数字是古代罗马人创造的,数字共只有7个:
I(代表1),V(代表5),X(代表10),L(代表50),C(代表100),D(代表500),M(代表1000)
它们按下面三种规律组合起来,能表示任何一个正整数:
(1)“重复几次”:一个罗马数字重复几次,就表示这个数的几倍。例如 II 为2,XXX为30
(2)“右加左减”:在一个数字的右边附着一个较小的数字,是表示大数字加小数字的数目。例如VI表示5加1是6,XXII是22;
在一个数字的左边附着一个较小的数字,是表示大数字减小数字的数目。例如IV表示5减1是4,IX是9;
注意:”左减“不能越等。例如:99不能写成IC,只能写成XCIX,即100减10再加上9.那么左减的情况只有下面几种情况:
"CM"(1000-100=900),"CD"(500-100=400),"XC"(100-10=90),"XL"(50-10=40),"IX"(10-1=9),"IV"(5-1=4)
(3)”加一横线“:在罗马数字上加一横线,表示该数字的1000倍。两条横线则表示百万倍。
Integer to Roman:
Given an integer, convert it to a roman numeral.
Input is guaranteed to be within the range from 1 to 3999.
分析:1~3999范围内的数字用规则(1)(2)即可表示,将7个数字和左减的情况按照从大到小的顺序全部列出,任何数据都可以由这些字符串拼接而成。代码:
public class Solution {
public String intToRoman(int num) {
StringBuilder sb = new StringBuilder();
String[] roman = {"M","CM","D","CD","C","XC","L","XL","X","IX","V","IV","I"};
int[] values = {1000, 900, 500,400, 100, 90, 50, 40, 10, 9, 5, 4, 1};
for(int i = 0; i < values.length; i++){
while(num >= values[i]){
num -= values[i];
sb.append(roman[i]);
}
if(num == 0) break;
}
return sb.toString();
}
}
Integer to Roman:
Given a roman numeral, convert it to an integer.
Input is guaranteed to be within the range from 1 to 3999.
分析:将字符串拆分成字符数组,将字符数组转化为整型数组,根据右加左减的规则,依次计算便可得到代码:
public class Solution {
public int romanToInt(String s) {
char[] c = s.toCharArray();
int[] num = new int[c.length];
for(int i = 0; i < c.length; i++){
switch(c[i]){
case 'I': num[i] = 1; break;
case 'V': num[i] = 5; break;
case 'X': num[i] = 10; break;
case 'L': num[i] = 50; break;
case 'C': num[i] = 100; break;
case 'D': num[i] = 500; break;
case 'M': num[i] = 1000; break;
}
}
int res = num[0];
for(int i = 1; i < num.length; i++){
if(num[i] > num[i-1])
res += num[i] - 2 * num[i-1];
else
res += num[i];
}
return res;
}
}