Roman numerals are represented by seven different symbols: I
, V
, X
, L
, C
, D
and M
.
Symbol Value
I 1
V 5
X 10
L 50
C 100
D 500
M 1000
For example, two is written as II
in Roman numeral, just two one's added together. Twelve is written as, XII
, which is simply X
+ II
. The number twenty seven is written as XXVII
, which is XX
+ V
+ II
.
Roman numerals are usually written largest to smallest from left to right. However, the numeral for four is not IIII
. Instead, the number four is written as IV
. Because the one is before the five we subtract it making four. The same principle applies to the number nine, which is written as IX
. There are six instances where subtraction is used:
-
I
can be placed beforeV (5)
andX (10)
to - make4
and9
. -
X
can be placed beforeL (50)
andC (100)
to make40
and90
. -
C
can be placed beforeD (500)
andM (1000)
to make400
and900
.
Given a roman numeral, convert it to an integer. Input is guaranteed to be within the range from 1
to 3999
.
Example 1:
Input
: "III"
Output
: 3
Example 2:
Input
: "IV"
Output
: 4
Example 3:
Input
: "IX"
Output
: 9
Example 4:
Input
: "LVIII"
Output
: 58
Explanation
: L = 50, V= 5, III = 3.
Example 5:
Input
: "MCMXCIV"
Output
: 1994
Explanation
: M = 1000, CM = 900, XC = 90 and IV = 4.
题目大意:
把罗马数字转化为阿拉伯数字。罗马数字能够用I
, V
, X
, L
, C
, D
和M
这七个数字来表示。注意:数字介于1到3999之间。
解题思路:
emmmmmmmmmmmmmmmmmmm~~~~~~~~~~~~~~~~,题目是昨天的对换版
不用昨天的解法了,考虑用一个无序容器将罗马数字和对应的阿拉伯数字成对存起来先,然后1 2 3 5 6 7 8这种都容易判断,所以主要就在于判断4 和 9,所以要判断两个相邻位的前一个数是否比后一个数小,如果是就证明这两位数是用来构成4 或 9的,其他的就直接加所代表数字就行。
解题代码:
class Solution {
public:
int romanToInt(string s) {
map<char,int> conv = { {'M', 1000},{'D', 500},{'C', 100},{'L', 50},{'X', 10},{'V', 5},{'I', 1} };
int res = 0;
size_t it = 0, size = s.size() - 1;
while (it <= size) {
if (conv[s[it]] < conv[s[it + 1]])
{
res += (conv[s[it + 1]] - conv[s[it]]);
++it;
}
else
{
res += conv[s[it]];
}
++it;
}
return res;
}
};
网友评论