leetcode题目汇集 — Roman与Integer之间的互换
参考网址https://zh.wikipedia.org/wiki/%E7%BD%97%E9%A9%AC%E6%95%B0%E5%AD%97
Roman To Integer
搬运维基百科对罗马数字性质的介绍:
右加左减:
- 在较大的罗马数字的右边记上较小的罗马数字,表示大数字加小数字。
- 在较大的罗马数字的左边记上较小的罗马数字,表示大数字减小数字。
- 左减的数字有限制,仅限于I、X、C。比如45不可以写成VL,只能是XLV
- 但是,左减时不可跨越一个位值。比如,99不可以用IC( )表示,而是用XCIX( )表示。(等同于阿拉伯数字每位数字分别表示。)
- 左减数字必须为一位,比如8写成VIII,而非IIX。
- 右加数字不可连续超过三位,比如14写成XIV,而非XIIII。(见下方“数码限制”一项。)
public class Solution {
public int romanToInt(String s) {
Map<Character, Integer> map = new HashMap<Character, Integer>();
map.put('I', 1);
map.put('V', 5);
map.put('X', 10);
map.put('L', 50);
map.put('C', 100);
map.put('D', 500);
map.put('M', 1000);
int result = 0;
int i = 0;
for (; i < s.length() - 1; ) {
if ((s.charAt(i) == 'I' || s.charAt(i) == 'X' || s.charAt(i) == 'C') && map.get(s.charAt(i)) < map.get(s.charAt(i + 1))) {
result = result + map.get(s.charAt(i + 1)) - map.get(s.charAt(i));
i = i + 2;
} else {
result = result + map.get(s.charAt(i));
i = i + 1;
}
}
if (i == s.length() - 1) {
result = result + map.get(s.charAt(i));
}
return result;
}
}
Integer To Roman:
将需要特殊处理的数字单独罗列出来,并用num一一比较,依次相加即可。
考虑到最终的结果result需要多次进行拼接,如果追求效率的话,可以考虑用StringBuilder,最后转换成String即可。
下面的代码直接使用的String,最好使用StringBuilder
public class Solution {
public String intToRoman(int num) {
int[] nums = {1000,900,500,400,100,90,50,40,10,9,5,4,1};
String[] romans = {"M","CM","D","CD","C","XC","L","XL","X","IX","V","IV","I"};
int index = 0;
int count = 0;
String result = "";
while (num > 0) {
count = num / nums[index];
for (int i = 0; i < count; i++) {
result += romans[index];
num -= nums[index];
}
index++;
}
return result;
}
}