题目链接题目大意
罗马数字包含以下七种字符:, , , ,, 和 。
字符 数值
I 1
V 5
X 10
L 50
C 100
D 500
M 1000
例如, 罗马数字 2 写做 ,即为两个并列的 1。12 写做 ,即为 + 。 27 写做 , 即为 + + 。
通常情况下,罗马数字中小的数字在大的数字的右边。但也存在特例,例如 4 不写做 ,而是 。数字 1 在数字 5 的左边,所表示的数等于大数 5 减小数 1 得到的数值 4 。同样地,数字 9 表示为 。这个特殊的规则只适用于以下六种情况:
可以放在 (5) 和 (10) 的左边,来表示 4 和 9。
可以放在 (50) 和 (100) 的左边,来表示 40 和 90。
可以放在 (500) 和 (1000) 的左边,来表示 400 和 900。
给你一个整数,将其转为罗马数字。
提示:
输入: num = 1994
输出: "MCMXCIV"
解释: M = 1000, CM = 900, XC = 90, IV = 4.
定义一个 ;
关键字表示字符,权值表示数字
把输入的每个整数进行分解存入一个栈
然后在哈希表 中遍历权值与栈中数字相等的下标
用
class Solution {
public:
string intToRoman(int num) {
unordered_map<string,int> p{
{"I",1},{"V",5},{"X",10},{"L",50},{"C",100},{"D",500},{"M",1000},
{"II",2},{"III",3},{"VI",6},{"VII",7},{"VIII",8},
{"IV",4},{"IX",9},{"XX",20},{"XXX",30},{"LX",60},{"LXX",70},{"LXXX",80},
{"XL",40},{"XC",90},{"CC",200},{"CCC",300},{"DC",600},{"DCC",700},{"DCCC",800},
{"CD",400},{"CM",900},{"MM",2000},{"MMM",3000}};
int t = 1;
stack<int> sta;
while(num)
{
int yu = num%10;
int now = yu*t;
t *= 10;
num /= 10;
sta.push(now);
}
string ans = "";
while(!sta.empty())
{
auto x = sta.top(); sta.pop();
for(auto& y : p) if(y.second == x) ans += y.first;
}
return ans;
}
};