13. Roman to Integer

欢迎fork and star:Nowcoder-Repository-github

13. Roman to Integer

题目

Given a roman numeral, convert it to an integer.

Input is guaranteed to be within the range from 1 to 3999.

解析:

  • 给定 “DCXXI”字符串,从左向右走,左边是高位
  • 需要用到map数据结构,来将罗马数字的字母转化为对应的整数值,因为输入的一定是罗马数字,那么我们只要考虑两种情况即可:
  • 第一,如果当前数字是最后一个数字,或者之后的数字比它小的话,则加上当前数字;第二,其他情况则减去这个数字
class Solution_13 {
public:
    int romanToInt(string s) { // "DCXXI"  "MCMXCVI"
        int ret = 0;
        unordered_map<char, int> mp{ { 'I', 1 }, { 'V', 5 }, { 'X', 10 }, { 'L', 50 }, { 'C', 100 }, { 'D', 500 }, { 'M', 1000 } };
        ret = mp[s[s.size()-1]];
        for (int i = s.size()-2; i >=0; --i)  // 从后往前走 //或者从前往后走,都是当前和之后的数字比较
        {
            if (mp[s[i]] >= mp[s[i+1]]) 
            {
                ret += mp[s[i]];
            }
            else
            {
                ret -= mp[s[i]]; //"CM":100-100=900
            }
        }
        return ret;
    }
};

- 当前和之前的数字比较,则需要减去之前多加的一次
- 我们也可以每次跟前面的数字比较,如果小于等于前面的数字,我们先加上当前的数字,如果大于的前面的数字,我们加上当前的数字减去二倍前面的数字,这样可以把在上一个循环多加数减掉

class Solution {
public:
    int romanToInt(string s) {
        int res = 0;
        unordered_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 (i == 0 || m[s[i]] <= m[s[i - 1]]) res += m[s[i]];
            else res += m[s[i]] - 2 * m[s[i - 1]];
        }
        return res;
    }
};

题目来源

    原文作者:ranjiewen
    原文地址: https://www.cnblogs.com/ranjiewen/p/8312900.html
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞