题目
罗马数字包含以下七种字符: I, V, X, L,C,D 和 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 到 3999 的范围内。示例 1:
输入: "III"
输出: 3
示例 2:输入: "IV"
输出: 4
示例 3:输入: "IX"
输出: 9
示例 4:输入: "LVIII"
输出: 58
解释: L = 50, V= 5, III = 3.
示例 5:输入: "MCMXCIV"
输出: 1994
解释: M = 1000, CM = 900, XC = 90, IV = 4.
思路
那六种情况也就是说,只有当前者的值小于后者,才进行对前者的减法,所以只需要每次和下一次对比就行了,其他情况都是加法
代码
1 class Solution { 2 public: 3 int romanToInt(string s) { 4 int chang = s.size(); 5 int sum=0,index=0; 6 for(index=0;;index++){ 7 if(index==chang-1){ 8 sum+=getsum(s[index]);//注意别把index写成chang,因为chang是溢出的 9 break; 10 } 11 else{ 12 if(getsum(s[index])<getsum(s[index+1])) 13 sum-=getsum(s[index]); 14 else 15 sum+=getsum(s[index]); 16 } 17 18 } 19 20 return sum; 21 } 22 int getsum(char c){ 23 int num; 24 switch(c){ 25 case 'I':num=1; 26 break; 27 case 'V':num=5; 28 break; 29 case 'X':num=10; 30 break; 31 case 'L':num=50; 32 break; 33 case 'C':num=100; 34 break; 35 case 'D':num=500; 36 break; 37 case 'M':num=1000; 38 break; 39 40 } 41 return num; 42 } 43 44 45 };
解释代码
22-42行用了一个函数,来对每一个罗马数字进行赋值,接着就是用这个函数来调用每个字母的值,最后返回调用的值也就是num。
3-21行的chang是确定输入罗马字符的长度,sum是总值,index是现在到字符的下标位置
7-8行是当index到最后一个位置时,也没有右边的值了,无需比较左右值大小,所以直接加上s【index】即可
11行是倘若没有到最后一个字符时的情况
12-13行首先判断是否左边的值小于右边的值,小于的话,就减去左边的值
14-15行 左边的值比右边值大的话,那就加上左边的值
20行的return sum是返回最后的总和,此时21行的大括号是第3行的那个,因为接下来的函数是自定义的,是属于第一行solution类中的。
收获
s.size,s为string类型时,是获取长度的
巧用自定义函数
switch case语句的语法需要总结下,因为发现自己这个不足,比如case后单引号,以及case加冒号
这道题的最高赞是用python的字典划分写的,果然是python快呀,不过条条大路通罗马,选择自己所选择的走下去就好
这道题从晚上6点多开始写,中间去操场跑步,锻炼,直到晚上10点多才写出来。不过运动后自己回来看代码的精神突然很集中,并且今天运动时候,又仿佛回到了大一时候打拳击的那种一往无前,乐观的态度,这段时间总是很丧,遇难而退,运动后的心态,让我变成了遇难而上,我不怕麻烦,也不怕写代码走弯路,最大的弯路就是怕走弯路,有两个词,一个叫功不唐捐,一个叫殊途同归。有了麻烦去解决麻烦,有困难去解决困难,方法总比困难多,生活中要有种乐观积极的态度来面对生活,需要认真对待生活,我爱生活。写代码同时也成为了我专注注意力以及认真思考的过程,我很享受代码从一无所知,让我通过搜索各种资料,通过各种途径,把它搞懂的感觉,我喜欢这种感觉。
本来这篇博客是22点多打算写的,但是中间有个新认识的同学我们商量了一个数据可视化的比赛,期间我在找数据,所以就拖延到现在,我还拖延了大概有个3,4篇leetcode题目没写,明天继续加油!
原题链接
13. 罗马数字转整数