zoukankan      html  css  js  c++  java
  • 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;
        }
    };
    

    题目来源

  • 相关阅读:
    scala之伴生对象的继承
    scala之伴生对象说明
    “Failed to install the following Android SDK packages as some licences have not been accepted” 错误
    PATH 环境变量重复问题解决
    Ubuntu 18.04 配置java环境
    JDBC的基本使用2
    DCL的基本语法(授权)
    ZJNU 1374
    ZJNU 2184
    ZJNU 1334
  • 原文地址:https://www.cnblogs.com/ranjiewen/p/8312900.html
Copyright © 2011-2022 走看看