题目描述
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 make 4 and 9. -
X
can be placed beforeL
(50) andC
(100) to make 40 and 90. -
C
can be placed beforeD
(500) andM
(1000) to make 400 and 900.
Given an integer, convert it to a roman numeral. Input is guaranteed to be within the range from 1 to 3999.
Example 1:
Input: 3 Output: "III"
Example 2:
Input: 4 Output: "IV"
Example 3:
Input: 9 Output: "IX"
Example 4:
Input: 58 Output: "LVIII" Explanation: L = 50, V = 5, III = 3.
Example 5:
Input: 1994 Output: "MCMXCIV" Explanation: M = 1000, CM = 900, XC = 90 and IV = 4.
分析
建立映射表,把特殊情况也加入到映射表中,包括4, 9, 40等等,不需要分类考虑之类的,这样更简便。
注意:虽然映射表的键是从大到小初始化,但是由于是有序的map,还是会重排为从小到大,还不如一开始就从小到大初始化。但是又不能用unordered_map,因为它是完全无序的。
class Solution {
public:
string intToRoman(int num) {
map<int,string> m{{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"}};
string ans;
for(auto it=m.rbegin();it!=m.rend();it++){
while(num>=it->first){
ans+=it->second;
num-=it->first;
}
}
return ans;
}
};
正在拼命学习的大学狗
发布了53 篇原创文章 · 获赞 7 · 访问量 2823
私信
关注