leetcode每日一题
[1738] 找出第 K 大的异或坐标值
[1744] 你能在你最喜欢的那天吃到你最喜欢的糖果吗?
[231] 2的幂
堆排复习
[461] 汉明距离
[1190] 反转每对括号间的子串
[1707] 与数组中元素的最大异或值
[810] 黑板异或游戏
[1035] 不相交的线
[692] 前K个高频单词
[872] 叶子相似的树
[1442] 形成两个异或相等数组的三元组数目
[993] 二叉树的堂兄弟节点
[421] 数组中两个数的最大异或值
[13] 罗马数字转整数
[12] 整数转罗马数字
[1269]. 停在原地的方案数
[1310] 子数组异或查询
[1734] 解码异或后的排列
本文档使用 MrDoc 发布
-
+
首页
[12] 整数转罗马数字
## [12] 整数转罗马数字 [力扣原题链接](https://leetcode-cn.com/problems/integer-to-roman/) 罗马数字包含以下七种字符: `I`, `V`, `X`, `L`,`C`,`D` 和 `M`。 <pre><strong> 字符 </strong> <strong> 数值 </strong> I 1 V 5 X 10 L 50 C 100 D 500 M 1000</pre> 例如, 罗马数字 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:** <pre><strong> 输入:</strong> num = 3 <strong> 输出:</strong> "III"</pre> **示例 2:** <pre><strong> 输入:</strong> num = 4 <strong> 输出:</strong> "IV"</pre> **示例 3:** <pre><strong> 输入:</strong> num = 9 <strong> 输出:</strong> "IX"</pre> **示例 4:** <pre><strong> 输入:</strong> num = 58 <strong> 输出:</strong> "LVIII" <strong> 解释:</strong> L = 50, V = 5, III = 3. </pre> **示例 5:** <pre><strong> 输入:</strong> num = 1994 <strong> 输出:</strong> "MCMXCIV" <strong> 解释:</strong> M = 1000, CM = 900, XC = 90, IV = 4.</pre> **提示:** * `1 <= num <= 3999` ### 思路 根据题意定义好固定的数字跟罗马字符映射关系,再用一个 vector 保存已有数据,将 num 依次转换为可转化的罗马数字并拼接起来即可。 ### 代码 ```cpp class Solution { public: std::map<int,string> num_2_str_map; //数字与罗马字符映射关系 std::vector<int> can_change_num; //保存有映射关系的数据 并逆序排序 string helper(int num,int begin_index) //begin_index 参数 用来减少重复计算 不需要每次都从第一个开始计算 { string cur_str; if(begin_index < 0 || begin_index >= (int)can_change_num.size()) return ""; //越界保护 出现这种情况正常就是转化完成了 if(num <= 0) return ""; //递归出口 转化完成 for(int i = begin_index;i < (int)can_change_num.size(); ++i) //从 begin_index 开始检查 num 可转化为哪些数字 { if(num >= can_change_num[i]) { cur_str += num_2_str_map[can_change_num[i]]; //转化 cur_str += helper(num - can_change_num[i],i); //转化剩下的数字 break; } } return cur_str; } string intToRoman(int num) { if(num_2_str_map.empty()) //这一段正常应该在构造函数里处理 { num_2_str_map[1] = "I"; num_2_str_map[4] = "IV"; num_2_str_map[5] = "V"; num_2_str_map[9] = "IX"; num_2_str_map[10] = "X"; num_2_str_map[40] = "XL"; num_2_str_map[50] = "L"; num_2_str_map[90] = "XC"; num_2_str_map[100] = "C"; num_2_str_map[400] = "CD"; num_2_str_map[500] = "D"; num_2_str_map[900] = "CM"; num_2_str_map[1000] = "M"; can_change_num.clear(); for(auto iter = num_2_str_map.begin();iter != num_2_str_map.end(); ++iter) { can_change_num.push_back(iter->first); } std::sort(can_change_num.begin(),can_change_num.end(),greater<int>()); //逆序排序 } return helper(num,0); } }; ``` ### 力扣题解代码 ```cpp const string thousands[] = {"", "M", "MM", "MMM"}; const string hundreds[] = {"", "C", "CC", "CCC", "CD", "D", "DC", "DCC", "DCCC", "CM"}; const string tens[] = {"", "X", "XX", "XXX", "XL", "L", "LX", "LXX", "LXXX", "XC"}; const string ones[] = {"", "I", "II", "III", "IV", "V", "VI", "VII", "VIII", "IX"}; class Solution { public: string intToRoman(int num) { return thousands[num / 1000] + hundreds[num % 1000 / 100] + tens[num % 100 / 10] + ones[num % 10]; } }; ```
ty
2021年5月14日 10:36
转发文档
收藏文档
上一篇
下一篇
手机扫码
复制链接
手机扫一扫转发分享
复制链接
阅读量
次
本站总访问量
次
本站访客数
人次
Markdown文件
分享
链接
类型
密码
更新密码