算法——罗马数字与整数的相互转化(M/S)

题目

图片来自leetcode

测试数据

输入: “MCMXCIV”
输出: 1994
解释: M = 1000, CM = 900, XC = 90, IV = 4.
和反过来

问题分析

这一题没有用什么特别的算法和数据结构,主要使用的就是贪心与字典结构。
对于数字转化为罗马字,我使用的是贪心算法,把6个特例加进字典了,从大到小取。
对于罗马字转化为数字,就是遍历,我采用从右往左遍历,用下标标记目前为止最大的罗马数,遇到小于它的直接减,大于它的直接加并且更新最大下标。
(后者采用C++,对于其使用不太熟,主要在这里写下C++的字典总结吧)

题解

Python题解

解决数字到罗马字的转化(贪心,字典)

class Solution:
    def intToRoman(self, num: int) -> str:
        MAP = {1000:'M',900:'CM',500:'D',400:'CD', 100:'C',90:'XC',50:'L',40:'XL',10:'X',9:'IX',5:'V',4:'IV',1:'I'}
        ans = ''
        for i in MAP.keys():
            n = num // i
            num = num % i
            ans += MAP[i]*n
        return ans
C++题解
class Solution {
public:
    int romanToInt(string s) {
        int digit[7] = {1000,500,100,50,10,5,1};
        char str[7] = {'M','D','C','L','X','V','I'};
        int op = 6;
        int ans = 0;
        for(int i = s.length()-1; i >= 0; i--){
            for(int j = 0; j < 7; j++){
                if(s[i] == str[j]){
                    if(digit[j] < digit[op]){
                        ans -= digit[j];
                    }else{
                        ans += digit[j];
                        op = j;
                    }
                    break;
                }
            }
        }
        return ans;
    }
};
参考使用map题解
class Solution {
public:
    int romanToInt(string s) {
        int num=0;
        map<char, int> m = { {'I',1} ,{'V', 5} ,{'X', 10},{'L', 50} ,{'C', 100} ,{'D', 500} ,{'M', 1000} };
        for (int i = 0; i < s.size(); i++)
        {
            if (m[s[i]] >= m[s[i + 1]])
            {
                num = m[s[i]]+num;
            }
            else
            {
                num = m[s[i+1]] - m[s[i]]+ num;
                i++;
            }
        }
        return num;
    }
};

来源:力扣(LeetCode)il_

map<char, int> m = {{‘D’, 500} ,{‘M’, 1000} };

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值