Leetcode#13. Roman to Integer (罗马数字转化阿拉伯数字)

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个以及规则。
基本字符 相应的阿拉伯数字

基本字符IXCMVLD
阿拉伯数字1101001000550500
规则
  • 相同的数字连写、所表示的数等于这些数字相加得到的数、如:Ⅲ=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

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值