首页 > 其他分享 >力扣12.整数转罗马数字

力扣12.整数转罗马数字

时间:2023-10-19 12:22:05浏览次数:35  
标签:10 12 reflection int value 力扣 罗马数字 num result

罗马数字包含以下七种字符: 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 };

 

标签:10,12,reflection,int,value,力扣,罗马数字,num,result
From: https://www.cnblogs.com/coderhrz/p/17774442.html

相关文章

  • Win12网页版
    该讲不讲,Win12网页版,太强了,可以二开哦!!!GitHub下载链接:https://github.com/tjy-gitnub/win12效果预览体验:https://tjy-gitnub.github.io/win12/desktop.html    ......
  • RK3588开发笔记(二):基于方案商提供sdk搭建引入mpp和sdk的宿主机交叉编译Qt5.12.10环境
    前言  上一篇项目已经构建好了Qt,板子接入mipi屏幕也跑起来了,Qt也能正常运行了,现在需要接入定制开发的sdk,sdk中使用了硬解码等资源涉及到bsp的mpp,所以下一步就是引入mpp和sdk到Qt开发环境中,从而Qt中可以调用sdk接口进行进一步的应用结合开发了。 注意  本文公开了Q......
  • P1124 题解
    题目大意一个长度为\(n\)的字符串\(S\),进行以下操作。假设\(s\)为acbdef,每一次将首字母移至末尾,得到\(6\)个字符串:acbdefcbdefabdefacdefacbefacbdfacbde将每个字符串的首字母排序:acbdefbdefaccbdefadefacbefacbdfacbde每个字符串的末尾连在一起为fcab......
  • 力扣每日一题+python知识点回顾
    力扣题目:执行K次操作后的最大分数(题号:2530)给你一个下标从0开始的整数数组nums和一个整数k。你的起始分数为0。在一步操作中:选出一个满足0<=i<nums.length的下标i,将你的分数增加nums[i],并且将nums[i]替换为ceil(nums[i]/3)。返回在恰好执......
  • [ARC127F] ±AB
    [ARC127F]±AB给定整数\(a,b,v,m\),保证\(a\perpb\).初始有一个数\(x=v\),可以不断令其加上或减去\(a\)或\(b\).过程中必须有\(x\in[0,m]\),问\(x\)有多少种可能的取值。多测。\(T\le10^5\),\(1\lea<b\lem\le10^9\),\(0\lev\lem\).由于\(a\perpb\),当\(m\)极......
  • 罗马数字与阿拉伯数字
    罗马数字与阿拉伯数字关于罗马数字罗马数字是位置计数吗?罗马数字是一种部分位置计数系统。在传统的罗马数字表示法中,不同的符号代表不同的数值,这些符号的位置顺序和组合决定了最终表示的数值。因此,符号的位置确实在一定程度上影响数值的大小。然而,与二进制和十进制不同,罗马数......
  • 204 K8S API资源对象介绍03 (Job CronJob Endpoint ConfigMap Secret) 2.12-2.16
    一、API资源对象Job一次性运行后就退出的Pod1.1使用kubect生成YAML文件#kubectlcreatejobjob01--image=busybox--dry-run=client-oyaml>job01.yaml#vimjob01.yaml#catjob01.yamlapiVersion:batch/v1kind:Jobmetadata:creationTimestamp:nullnam......
  • 初学Bokeh:自定义标题【12】跬步
    初学Bokeh:自定义标题【12】跬步大多数绘图都包含标题(headline)。可以通过向figure()函数传递标题参数来为图像添加标题:p=figure(title="Headlineexample")标题文本有多种样式,示例如下:frombokeh.plottingimportfigure,show#preparesomedata#定义绘图数据x......
  • 企业IT部门管理者必备:CIO工作指南 P120
       本人从事咨询工作多年,二十年一线数字化规划咨询经验,提供制造业数智化转型规划服务,顶层规划/企业架构/数据治理/数据安全解决方案资料干货.   【智能制造数字化咨询】该PPT共120页,由于篇幅有限,以下为部分资料,如需完整原版 方案,点击关注下方。人们经常建议CIO将IT......
  • 90V转12伏恒压芯片WT6037
     WT6037是一款高压同步降压转换器,可在10V到90V的宽输入电压范围内工作适用于宽电压输入12V-72V电池组系统降压和60V-90V降压应用。WT6037可提供4A连续负载电流,转换效率高达92%。  WT6037采用具有内置补偿的固定频率峰值电流控制,无需外部组件。高侧MOSFET中的逐周期电流限制......