题目描述:罗马数字转阿拉伯数字,阿拉伯数字转罗马数字,数字的范围是1~3999。
拿到这个题目,首先得明白罗马数字的书写形式及与数字的照关系,如下图所示:
所以,对于罗马数字转阿拉伯数字,可以借用map表中的<key,value>对的格式进行处理
public class Solution {
public int romanToInt(String s) {
char[] symbol = {'I','V','X','L','C','D','M'};
int[] value = {1,5,10,50,100,500,1000};
Map<Character, Integer> map = new HashMap<Character, Integer>();
for(int i=0; i<symbol.length; i++)
map.put(symbol[i], value[i]);
int len = s.length();
int result = 0;
if(len < 0) return 0;
result += map.get(s.charAt(0));
for(int i=1; i<s.length(); i++){
int cur = map.get(s.charAt(i));
int pre = map.get(s.charAt(i-1));
if(cur <= pre){
result += cur;
}else{
result = result + cur - 2*pre;
}
}
return result;
}
}
同理,对于阿拉伯数字转罗马数字,考虑到如4、9、40、90、400、900的特殊性,则将这些都放在数组中,然后依次查数组即可:
class Solution {
public:
string intToRoman(int num) {
if (num > 3999 || num < 1)
return string("The num is out of range!");
const int number[] = { 1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1};
const string symbol[] = { "M", "CM", "D", "CD", "C", "XC","L", "XL", "X", "IX", "V", "IV", "I"};
string roman;
for (size_t i = 0; num > 0; i++)
{
int count = num / number[i];
num %= number[i];
for (; count > 0; count--)
roman += symbol[i];
}
return roman;
}
};