随笔 - 118  文章 - 0  评论 - 0  阅读 - 24152

力扣12.整数转罗马数字

罗马数字包含以下七种字符: I, V, X, LCD 和 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 };
复制代码

 

posted on   Coder何  阅读(7)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

点击右上角即可分享
微信分享提示