十进制整数转罗马数字 – 罗马数字转十进制整数
IntToRoman 和 RomanToInt 两个不错的题,搞成模板不错。
12. Integer to Roman
Given an integer, convert it to a roman numeral.
Input is guaranteed to be within the range from 1 to 3999.
13. Roman to Integer
Given a roman numeral, convert it to an integer.
Input is guaranteed to be within the range from 1 to 3999.
先上代码后讲题。
第十二题手动打表,然后一一匹配即可。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
class Solution(object): def intToRoman(self, num): """ :type num: int :rtype: str """ #基本字符 #I1 V5 X10 L50 C100 D500 M1000 Roman = [ ["", "I", "II", "III", "IV", "V", "VI", "VII", "VIII", "IX"], ["", "X", "XX", "XXX", "XL", "L", "LX", "LXX", "LXXX", "XC"], ["", "C", "CC", "CCC", "CD", "D", "DC", "DCC", "DCCC", "CM"], ["", "M", "MM", "MMM"], ] rt = "" rt += Roman[3][num/1000] rt += Roman[2][num/100%10] rt += Roman[1][num/10%10] rt += Roman[0][num%10] return rt |
十三题我先用的查找比较慢,后来发现是可以一次遍历的。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
class Solution(object): def romanToInt(self, s): """ :type s: str :rtype: int """ Int = {"I":1, "V":5, "X":10, "L":50, "C":100, "D":500, "M":1000} rt = Int[s[0]] for i in range(1,len(s)) : if Int[s[i-1]] < Int[s[i]] : rt += Int[s[i]] - Int[s[i-1]]*2 else : rt += Int[s[i]] return rt |
应该还有优化空间,不过应该不需要吧。快不了多少了。
今天又试了下优化,这样看起来爽多了。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
class Solution(object): def romanToInt(self, s): """ :type s: str :rtype: int """ Int = {"I":1, "V":5, "X":10, "L":50, "C":100, "D":500, "M":1000} rt = Int[s[len(s)-1]] for i in range(0,len(s)-1) : if Int[s[i]] < Int[s[i+1]] : rt -= Int[s[i]] else : rt += Int[s[i]] return rt |
简单规则解析:
罗马数字采用七个罗马字母作数字,即:
- Ⅰ 1
- X 10
- C 100
- M 1000
- V 5
- L 50
- D 500
记数的方法如下:
-
相同的数字连写,所表示的数等于这些数字相加得到的数,如 Ⅲ=3;
-
小的数字在大的数字的右边,所表示的数等于这些数字相加得到的数,如 Ⅷ=8、Ⅻ=12;
-
小的数字(限于 Ⅰ、X 和 C)在大的数字的左边,所表示的数等于大数减小数得到的数,如 Ⅳ=4、Ⅸ=9;
-
在一个数的上面画一条横线,表示这个数增值 1,000 倍(这里不需要)
组数规则,有两条须注意掌握:
-
基本数字 Ⅰ、X 、C 中的任何一个、自身连用构成数目、或者放在大数的右边连用构成数目、都不能超过三个;放在大数的左边只能用一个;
-
不能把基本数字 V 、L 、D 中的任何一个作为小数放在大数的左边采用相减的方法构成数目;放在大数的右边采用相加的方式构成数目、只能使用一个;
其实我觉得这两个题目,做成模板拿来用是最好了,没啥难度,也好掌握。
C++版的用python改改就好了…(⊙﹏⊙)b
【LeetCode】12. Integer to Roman & 13. Roman to Integer