题目链接
题目大意
罗马数字包含以下七种字符:
I
I
I,
V
V
V,
X
X
X,
L
L
L,
C
C
C,
D
D
D 和
M
M
M。
字符 数值
I 1
V 5
X 10
L 50
C 100
D 500
M 1000
例如, 罗马数字 2 写做 I I II II ,即为两个并列的 1。12 写做 X I I XII XII ,即为 X X X + I I II II 。 27 写做 X X V I I XXVII XXVII, 即为 X X XX XX + V V V + I I II II。
通常情况下,罗马数字中小的数字在大的数字的右边。但也存在特例,例如 4 不写做 I I I I IIII IIII,而是 I V IV IV。数字 1 在数字 5 的左边,所表示的数等于大数 5 减小数 1 得到的数值 4 。同样地,数字 9 表示为 I X IX IX。这个特殊的规则只适用于以下六种情况:
I
I
I 可以放在
V
V
V (5) 和
X
X
X (10) 的左边,来表示 4 和 9。
X
X
X 可以放在
L
L
L (50) 和
C
C
C (100) 的左边,来表示 40 和 90。
C
C
C 可以放在
D
D
D (500) 和
M
M
M (1000) 的左边,来表示 400 和 900。
给你一个整数,将其转为罗马数字。
提示:
1
≤
n
u
m
≤
3999
1 \leq num \leq 3999
1≤num≤3999
输入: num = 1994
输出: "MCMXCIV"
解释: M = 1000, CM = 900, XC = 90, IV = 4.
定义一个
u
n
o
r
d
e
r
e
d
_
m
a
p
<
s
t
r
i
n
g
,
i
n
t
>
p
unordered\_map<string,int>p
unordered_map<string,int>p;
关键字表示字符,权值表示数字
把输入的每个整数进行分解存入一个栈
然后在哈希表
p
p
p 中遍历权值与栈中数字相等的下标
用
s
t
r
i
n
g
string
string 存下标即可
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;
}
};