罗马数字包含以下七种字符: 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:
输入: num = 3 输出: "III"
示例 2:
输入: num = 4 输出: "IV"
示例 3:
输入: num = 9 输出: "IX"
示例 4:
输入: num = 58 输出: "LVIII" 解释: L = 50, V = 5, III = 3.
示例 5:
输入: num = 1994 输出: "MCMXCIV" 解释: M = 1000, CM = 900, XC = 90, IV = 4.
提示:
1 <= num <= 3999
无脑模拟
1 class Solution 2 { 3 public: 4 map<int, char> reflection; 5 int value[7] = {1000, 500, 100, 50, 10, 5, 1}; 6 string result = ""; 7 void init() 8 { 9 reflection[1] = 'I'; 10 reflection[5] = 'V'; 11 reflection[10] = 'X'; 12 reflection[50] = 'L'; 13 reflection[100] = 'C'; 14 reflection[500] = 'D'; 15 reflection[1000] = 'M'; 16 } 17 string intToRoman(int num) 18 { 19 init(); 20 while (num > 0) 21 { 22 for (int i = 0; i < 7; ++i) 23 { 24 int high = num / value[i]; 25 if (high > 0) 26 { 27 for (int j = 0; j < high; ++j) 28 result.push_back(reflection[value[i]]); 29 num = num % value[i]; 30 break; 31 } 32 else 33 { 34 if (value[i] == 1000 || value[i] == 100 || value[i] == 10) 35 { 36 if (num >= value[i] - value[i + 2]) 37 { 38 result.push_back(reflection[value[i + 2]]); 39 result.push_back(reflection[value[i]]); 40 num %= value[i + 2]; 41 break; 42 } 43 } 44 else if (i != 6) 45 { 46 if (num >= value[i] - value[i + 1]) 47 { 48 result.push_back(reflection[value[i + 1]]); 49 result.push_back(reflection[value[i]]); 50 num %= value[i + 1]; 51 break; 52 } 53 } 54 } 55 } 56 } 57 58 return result; 59 } 60 };
性能优化后
1 const pair<int, string> valueSymbols[] = { //map和pair数组相比性能下降非常多 2 {1000, "M"}, 3 {900, "CM"}, 4 {500, "D"}, 5 {400, "CD"}, 6 {100, "C"}, 7 {90, "XC"}, 8 {50, "L"}, 9 {40, "XL"}, 10 {10, "X"}, 11 {9, "IX"}, 12 {5, "V"}, 13 {4, "IV"}, 14 {1, "I"}, 15 }; 16 class Solution 17 { 18 public: 19 string intToRoman(int num) 20 { 21 string result = ""; 22 for (int i = 0; i < 13; ++i) 23 { 24 int high = num / valueSymbols[i].first; 25 if (high > 0) 26 { 27 for (int j = 0; j < high; ++j) //由于数据量小,题解给的累减和常用的除法时间上相差不大 28 { 29 result += valueSymbols[i].second; 30 } 31 } 32 num %= valueSymbols[i].first; 33 if (num == 0) 34 break; 35 } 36 return result; 37 } 38 };
标签:10,12,reflection,int,value,力扣,罗马数字,num,result From: https://www.cnblogs.com/coderhrz/p/17774442.html