题目
测试数据
输入: “MCMXCIV”
输出: 1994
解释: M = 1000, CM = 900, XC = 90, IV = 4.
和反过来
问题分析
这一题没有用什么特别的算法和数据结构,主要使用的就是贪心与字典结构。
对于数字转化为罗马字,我使用的是贪心算法,把6个特例加进字典了,从大到小取。
对于罗马字转化为数字,就是遍历,我采用从右往左遍历,用下标标记目前为止最大的罗马数,遇到小于它的直接减,大于它的直接加并且更新最大下标。
(后者采用C++,对于其使用不太熟,主要在这里写下C++的字典总结吧)
题解
Python题解
解决数字到罗马字的转化(贪心,字典)
class Solution:
def intToRoman(self, num: int) -> str:
MAP = {1000:'M',900:'CM',500:'D',400:'CD', 100:'C',90:'XC',50:'L',40:'XL',10:'X',9:'IX',5:'V',4:'IV',1:'I'}
ans = ''
for i in MAP.keys():
n = num // i
num = num % i
ans += MAP[i]*n
return ans
C++题解
class Solution {
public:
int romanToInt(string s) {
int digit[7] = {1000,500,100,50,10,5,1};
char str[7] = {'M','D','C','L','X','V','I'};
int op = 6;
int ans = 0;
for(int i = s.length()-1; i >= 0; i--){
for(int j = 0; j < 7; j++){
if(s[i] == str[j]){
if(digit[j] < digit[op]){
ans -= digit[j];
}else{
ans += digit[j];
op = j;
}
break;
}
}
}
return ans;
}
};
参考使用map题解
class Solution {
public:
int romanToInt(string s) {
int num=0;
map<char, int> m = { {'I',1} ,{'V', 5} ,{'X', 10},{'L', 50} ,{'C', 100} ,{'D', 500} ,{'M', 1000} };
for (int i = 0; i < s.size(); i++)
{
if (m[s[i]] >= m[s[i + 1]])
{
num = m[s[i]]+num;
}
else
{
num = m[s[i+1]] - m[s[i]]+ num;
i++;
}
}
return num;
}
};
来源:力扣(LeetCode)il_
map<char, int> m = {{‘D’, 500} ,{‘M’, 1000} };