微信改版,加星标不迷路!
每日一算法-罗马数字转整数
作者:阿广
阅读目录
1 题目
2 解析
1 题目
罗马数字包含以下七种字符: I
, V
, X
, L
,C
,D
和 M
。
字符 数值
I 1 V 5 X 10 L 50 C 100 D 500 M 1000
例如, 罗马数字 2 写做 II
,即为两个并列的 1。12 写做 XII
,即为 X
+ II
。 27 写做 XXVII
, 即为 XX
+ V
+ II
。
通常情况下,罗马数字中小的数字在大的数字的右边。但也存在特例,例如 4 不写做 IIII
,而是 IV
。数字 1 在数字 5 的左边,所表示的数等于大数 5 减小数 1 得到的数值 4 。同样地,数字 9 表示为 IX
。这个特殊的规则只适用于以下六种情况:
?I
可以放在 V
(5) 和 X
(10) 的左边,来表示 4 和 9。
?X
可以放在 L
(50) 和 C
(100) 的左边,来表示 40 和 90。
?C
可以放在 D
(500) 和 M
(1000) 的左边,来表示 400 和 900。
给定一个罗马数字,将其转换成整数。输入确保在 1 到 3999 的范围内。
示例 1:
输入: "III"输出: 3
示例 2:
输入: "IV"输出: 4
示例 3:
输入: "IX"输出: 9
示例 4:
输入: "LVIII"输出: 58解释: L = 50, V= 5, III = 3.
示例 5:
输入: "MCMXCIV"输出: 1994解释: M = 1000, CM = 900, XC = 90, IV = 4.
2 解析
整体的思路很简单,题目中是罗马数字到数字的转换,那么我们使用map数组存储对应关系,然后遍历罗马数字字符串的过程中判断是减法还是加法,最后返回结果就ok了。
2.1
首先使用map数组存储罗马数字和数字之间的映射关系。
map<char,int> m ;
m['I'] = 1;
m['V'] = 5;
m['X'] = 10;
m['L'] = 50;
m['C'] = 100;
m['D'] = 500;
m['M'] = 1000;
2.2
然后获取罗马数字的长度
int length = s.size();
遍历罗马数字
for(int i = 0 ; i < length ; i++){
//下边添加处理过程
}
2.3
遍历的过程当中,判断是减法还是加法。
判断为减法的情况的方法:
if(s[i] == 'I' && s[i+1] == 'V'){
result = result + m[s[i+1]]-m[s[i]];
i++;
}
else if (s[i] == 'I' && s[i+1] == 'X'){
result = result + m[s[i+1]]-m[s[i]];
i++;
}else if (s[i] == 'X' && s[i+1] == 'L'){
result = result + m[s[i+1]]-m[s[i]];
i++;
}else if (s[i] == 'X' && s[i+1] == 'C'){
result = result + m[s[i+1]]-m[s[i]];
i++;
}else if (s[i] == 'C' && s[i+1] == 'D'){
result = result + m[s[i+1]]-m[s[i]];
i++;
}else if (s[i] == 'C' && s[i+1] == 'M'){
result = result + m[s[i+1]]-m[s[i]];
i++;
}
2.4
判断为加法的情况(除了减法的情况,即为加法的情况)
else{
result += m[s[i]];
}
2.5
最后返回结果result即可
return result;
2.6
完整代码
class Solution {
public:
int romanToInt(string s) {
int result = 0;
map<char,int> m ;
m['I'] = 1;
m['V'] = 5;
m['X'] = 10;
m['L'] = 50;
m['C'] = 100;
m['D'] = 500;
m['M'] = 1000;
int length = s.size();
//printf("%d",length);
//result = m[s[0]];
for(int i = 0 ; i < length ; i++){
if(s[i] == 'I' && s[i+1] == 'V'){
result = result + m[s[i+1]]-m[s[i]];
i++;
}
else if (s[i] == 'I' && s[i+1] == 'X'){
result = result + m[s[i+1]]-m[s[i]];
i++;
}else if (s[i] == 'X' && s[i+1] == 'L'){
result = result + m[s[i+1]]-m[s[i]];
i++;
}else if (s[i] == 'X' && s[i+1] == 'C'){
result = result + m[s[i+1]]-m[s[i]];
i++;
}else if (s[i] == 'C' && s[i+1] == 'D'){
result = result + m[s[i+1]]-m[s[i]];
i++;
}else if (s[i] == 'C' && s[i+1] == 'M'){
result = result + m[s[i+1]]-m[s[i]];
i++;
}else{
result += m[s[i]];
}
}
return result;
}
};
今日问题
你去过哪些知名的景点?
有什么深刻的印象?
打卡格式:打卡第n天,答:...