【LeetCode012算法/编程练习C++】Integer to Roman //map的遍历&数组的妙用
来源:互联网 发布:日本产假多少天 知乎 编辑:程序博客网 时间:2024/06/08 02:19
12. Integer to Roman
- Total Accepted: 88076
- Total Submissions: 206738
- Difficulty: Medium
- Contributors: Admin
Given an integer, convert it to a roman numeral.
Input is guaranteed to be within the range from 1 to 3999.
题目:数字转化为罗马数字。
关键是理解转化规则: 链接 (详细粘贴到了最后)
---------------------------------------我的实现---------------------------------------
用到了map的逆序遍历,觉得还是蛮有用的,格式是:
//逆序需要end--以及begin--
map <类型A, 类型B>mapping;
for (map <类型A, 类型B>mapping::iterator i = mapping.begin(); i != mapping.end(); i++) {
i->first;//代表第i个类型A
i->second;//代表第i个类型B
}
class Solution {public:string intToRoman(int num) {string result = "";map <int, string>mapping;mapping[1] = "I";mapping[2] = "II";mapping[3] = "III";mapping[4] = "IV";mapping[5] = "V";mapping[9] = "IX";mapping[10] = "X";mapping[20] = "XX";mapping[30] = "XXX";mapping[40] = "XL";mapping[50] = "L";mapping[90] = "XC";mapping[100] = "C";mapping[200] = "CC";mapping[300] = "CCC";mapping[400] = "CD";mapping[500] = "D";mapping[900] = "CM";mapping[1000] = "M";while (num != 0) {map <int, string>::iterator begin = mapping.end();map <int, string>::iterator end = mapping.begin();begin--; end--;for (map <int, string>::iterator i=begin;i != end; i--) {if (num >= i->first) { result += i->second; num -= i->first; break; }}}return result;}};运行结果:
-----------------------------第二种非常简洁的Top Solution----------------------------
//每次看Top Solution都是一次膜拜…………好精巧的设计啊!!!
public static String intToRoman(int num) { String M[] = {"", "M", "MM", "MMM"}; String C[] = {"", "C", "CC", "CCC", "CD", "D", "DC", "DCC", "DCCC", "CM"}; String X[] = {"", "X", "XX", "XXX", "XL", "L", "LX", "LXX", "LXXX", "XC"}; String I[] = {"", "I", "II", "III", "IV", "V", "VI", "VII", "VIII", "IX"}; return M[num/1000] + C[(num%1000)/100] + X[(num%100)/10] + I[num%10];}
----------------------附上罗马数字规则以及对照表---------------------
//转自: http://www.cnblogs.com/glorywu/p/5256968.html
构造规则
罗马数字通过7个不同字母的重复或组合,能够表示出所有正整数(罗马数字中没有0)。
- I = 1
- V = 5
- X = 10
- L = 50
- C = 100
- D = 500
- M = 1000
1、字母是可以叠加的。
如I 表示 1,II 表示 2,III 表示 3。VI 表示 6(V=5,I=1,VI即V+I,等于6),VII 表示 7,VIII 表示 8。
2、表示为5的倍数的字母(V,L,D)不得重复。其余字母(I,X,C,M)至多可以重复3次。
(1) 如10应该表示为X,而不能是VV。再如十五应该表示为XV,而不是VVV。
(2)如4不能表示为IIII,而应该利用下一个最大的含五字符进行减操作得到,表示为IV(根据规则3,高位的I表示1,低位的V表示5,高位小于低位,因此用低位减去高位,5-1=4)。类似的,9不能表示为XIIII,因为I重复了4次。而要把它表示成10-1的形式,即IX。
3、罗马数字一般从高位到低位书写,从左向右阅读。若位于高位的数较大,则用高位的数加上低位的数;若位于高位的数较小,则用低位的数减去高位的数。
如CD和DC分别表示400和600。CD中,C在高位,它表示的数字是100,D在低位,它表示的数字是500,高位数字小于低位数字,因此用低位的D(500)减去高位的C(100),得出CD表示400;而在DC中,D在高位,数字为500,C在低位,数字为100,高位数字大于低位数字,因此高位加上低位,500+100,得出DC为600。
4、低位减去高位不能跨越一个位数且高位的数只能是I,X,C(即只能减1,减10,减100)。
(1)如99不能表示成100-1,即IC。因为C表示的100和I表示的1之间超过了一个位数。99应该表示成(100-10)+(10-1),即XCIX。
(2)如45不能表示成50-5,因为50-5要写成VL,而低位减高位,高位的数只能是I,X,C,显然V不在此列。所以45只能写成(50-10)+ 5的形式,即XLV。
5、在罗马数字的上方加上一条横线或者加上下标的Ⅿ,表示将这个数乘以1000。同理,两条横线则是乘以1000000。
只要理解了以上5条规则,就能在罗马数字和阿拉伯数字之间进行任意的转换了。最后附上罗马数字对照表:
祝刷题愉快~- 【LeetCode012算法/编程练习C++】Integer to Roman //map的遍历&数组的妙用
- leetcode012:Integer to Roman
- leetcode012 Integer to Roman
- Leetcode012 Integer to Roman
- 【LeetCode013算法/编程练习C++】Roman to Integer //难得击败了80%的人
- 【LeetCode算法练习(C++)】Integer to Roman
- 【LeetCode算法练习(C++)】Roman to Integer
- 数组 Integer to Roman
- Leetcode算法练习-easy篇-Roman to Integer
- 分析、测试与总结:罗马数字和阿拉伯数字的转换[roman to integer and integer to roman in c++]
- 13. Roman to Integer的C++解法
- 4.Roman to integer(integer to roman罗马数和整型数的相互转换)
- 数组遍历的练习
- C语言数组的妙用
- Leetcode在线编程integer-to-roman
- Leetcode在线编程roman-to-integer
- 每日算法之十一:Integer to Roman
- 每日算法之十二:Roman to Integer
- [Mapbox GL]调整LineString使其适应地图边界
- sql 同一列的多行内容拼接成字符串
- framework代码中添加资源编译不通过解决办法
- scanf_s输入%s的问题
- (0012) iOS 开发之MAC 终端命令学习
- 【LeetCode012算法/编程练习C++】Integer to Roman //map的遍历&数组的妙用
- java发送邮件
- Android开发-自定义View-AndroidStudio(十五)快速索引(2)
- RxSwift 学习指导索引
- BOM-不同浏览器对窗口尺寸的获取和修改
- ros_arduino_bridge网上资源
- ftrace 的使用
- [Gradle中文教程系列]-跟我学Gradle-5.3:依赖-管理依赖的版本(传递(transitive)\排除(exclude)\强制(force)\动态版本(+))
- SQL Server2005中使用XML-OPENXML