动手刷LeetCode-转换罗马字符

罗马数字转整数


给定一个罗马数字,将其转换成整数;

知识点

操作字符串;使用哈希表;
哈希表:哈希表存储的是由键(key)和值(value)组 成的数据。例如,我们将每个人的性别作为数 据进行存储,键为人名,值为对应的性别。

解题思路

哈希表法:将字母及其组合代表数值存入哈希表中,循环取出字符,寻找对应的数相加;
若是遇到特殊规则的组合,前一个字符设置为减,后一个字符正常计算;
具体步骤: 创建哈希表;
从字符串依次先取出两个字符和第二个字符比较,到底是取;两个字符还是一个字符;
最后相加一起;

class Solution {
public:
    int romanToInt(string s) {
        // 定义一个哈希表,键为字符,数字为值;
        unordered_map<string, int> M = {{"I", 1}, {"IV", 4}, {"IX", 9}, {"V", 5}, {"X", 10}, {"XL", 40}, {"XC", 90}, {"L", 50}, {"C", 100}, {"CD", 400}, {"CM", 900}, {"D", 500}, {"M", 1000}};
        int i=0;// 定义循环变量
        int ans= 0; // 
        string two,one;
        // 判断是为两个字符还是一个字符
        for(i=0;i<s.size();){
            two=s.substr(i,2); //从字符串s中下标为i开始去除2个值
            one=s.substr(i,1);
            if(M[two]){
                ans=ans+M[two];
                i=i+2;
            }
            else{
                ans=ans+M[one];
                i=i+1;

            }
        }
        return ans;

    }
};

直接单字符比较法:依次循环取出一个字符,判断是否比后面的大;若大则加上该字符,反之,减去该字符对应的值;

class Solution {
public:
    int romanToInt(string s) {
        unordered_map<char, int> mp;
        mp['I'] = 1;
        mp['V'] = 5;
        mp['X'] = 10;
        mp['L'] = 50;
        mp['C'] = 100;
        mp['D'] = 500;
        mp['M'] = 1000;
        
        int pos = 0, neg = 0;
        for (int i = 0;i < s.size()-1;++i){
            if (mp[s[i]] < mp[s[i+1]])
                neg -= mp[s[i]];
            else
                pos += mp[s[i]];
        }
        pos += mp[s.back()];
        
        return pos + neg;

    }
};

直接看透罗马字符运算的本质

小结

学习新东西,刚开始一定很难,但请坚持,不要放弃,认真,坚持下去,找到学成功的自信心和满足感

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值