动手刷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;

    }
};

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

小结

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

你可能感兴趣的:(笔记,字符串)