xuna小记:题目解法使用c++和Python两种,重点侧重在于解题思路和如何将解法用python语言实现。
题目
Given a roman numeral, convert it to an integer.
Input is guaranteed to be within the range from 1 to 3999.
题意
给你一个罗马数字,转换为对应的阿拉伯数字,罗马数字的范围为1~3999。
分析
阿拉伯数字是有10个基数,同样在罗马数字中也有基数,共7个以及规则。
基本字符 相应的阿拉伯数字
基本字符 | I | X | C | M | V | L | D |
---|---|---|---|---|---|---|---|
阿拉伯数字 | 1 | 10 | 100 | 1000 | 5 | 50 | 500 |
规则
- 相同的数字连写、所表示的数等于这些数字相加得到的数、如:Ⅲ=3;
- 小的数字在大的数字的右边、所表示的数等于这些数字相加得到的数、 如:Ⅷ=8、Ⅻ=12;
- 小的数字(限于 I、X 和 C)在大的数字的左边、所表示的数等于大数减小数得到的数、如:Ⅳ=4、Ⅸ=9;
- 正常使用时、连写的数字重复不得超过三次;
- 在一个数的上面画一条横线、表示这个数扩大 1000 倍。
- -
对照举例
个位数举例
Ⅰ-1、Ⅱ-2、Ⅲ-3、Ⅳ-4、Ⅴ-5、Ⅵ-6、Ⅶ-7、Ⅷ-8、Ⅸ-9
十位数举例
Ⅹ-10、Ⅺ-11、Ⅻ-12、XIII-13、XIV-14、XV-15、XVI-16、XVII-17、XVIII-18、XIX-19、XX-20、XXI-21、XXII-22、XXIX-29、XXX-30、XXXIV-34、XXXV-35、XXXIX-39、XL-40、L-50、LI-51、LV-55、LX-60、LXV-65、LXXX-80、XC-90、XCIII-93、XCV-95、XCVIII-98、XCIX-99
百位数举例
C-100、CC-200、CCC-300、CD-400、D-500、DC-600、DCC-700、DCCC-800、CM-900、CMXCIX-999
千位数举例
M-1000、MC-1100、MCD-1400、MD-1500、MDC-1600、MDCLXVI-1666、MDCCCLXXXVIII-1888、MDCCCXCIX-1899、MCM-1900、MCMLXXVI-1976、MCMLXXXIV-1984、MCMXC-1990、MM-2000、MMMCMXCIX-3999
千位数以上举例
幸运的是这道题目我们只要求到3999。没有用到规则的最后一条。
我们可以将上面的规则简化为两条:
- 本位小于前一位,结果相加本位罗马数字对应的阿拉伯数字。
- 本位大于前一位,结果相加本位罗马数字对应的阿拉伯数字减去2倍的前一位。
一个小例子演示一下:
XCIX-99 设res保存结果,初始化为0。
X res = 10
C C>X res = 10 + 100 - 2*10 = 90
I I
C++
使用map映射罗马数字为对应的阿拉伯数字。
class Solution {
public:
int romanToInt(string s)
{
map<char,int>q;
q['I']=1;
q['X']=10;
q['C']=100;
q['M']=1000;
q['V']=5;
q['L']=50;
q['D']=500;
int res = 0;
res = q[s[0]];
for(int i=1;i<s.size();i++)
{
if(q[s[i-1]]>=q[s[i]])//左边小于右边
res+=q[s[i]];
else //左边大于右边
res = res + q[s[i]] - 2*q[s[i-1]];
}
return res;
}
};
Python
在python中没有map,但是字典具有同样的功能:映射。
class Solution(object):
def romanToInt(self, s):
"""
:type s: str
:rtype: int
"""
q = {}
q['I']=1
q['X']=10
q['C']=100
q['M']=1000
q['V']=5
q['L']=50
q['D']=500
res = q[s[0]]
for i in range(1,len(s)):
if q[s[i-1]]>=q[s[i]]:
res = res + q[s[i]]
else:
res = res + q[s[i]] - 2*q[s[i-1]]
return res
参考资料:https://baike.baidu.com/item/%E7%BD%97%E9%A9%AC%E6%95%B0%E5%AD%97/772296?fr=aladdin
Github本题题解:https://github.com/xuna123/LeetCode/blob/master/Leetcode%2313.%20Roman%20to%20Integer.md