LeetCode-罗马数字转整数

  首先想到的是最暴力的解法,列出所有的可能,其实不用考虑字符串长度是奇数还是偶数,如果有下一位的话就判断是否属于特殊情况,如果没有下一位的话,就按照单位字符处理。运行结果超过86%的提交。

Tips

  1. continue只退出单层循环。break退出整个循环。
  2. 在处理字符串类型时,末尾会存在一位/0,所以在i到末尾时,判断i+1位不会出现超出索引范围的错误。

题解1

#include "iostream"
#include "string"
using namespace std;

class Solution {
public:
    int romanToInt(string s) {
        int len=s.length();
        int res=0;
        for(int i=0;i<len; )
        {
            if(s[i]=='I'&&s[i+1]=='V')
            {
                res=res+4;
                i+=2;
                continue;
            }
            if(s[i]=='I'&&s[i+1]=='X')
            {
                res=res+9;
                i+=2;
                continue;
            }
            if(s[i]=='X'&&s[i+1]=='L')
            {
                res=res+40;
                i+=2;
                continue;
            }
            if(s[i]=='X'&&s[i+1]=='C')
            {
                res=res+90;
                i+=2;
                continue;
            }
            if(s[i]=='C'&&s[i+1]=='D')
            {
                res=res+400;
                i+=2;
                continue;
            }
            if(s[i]=='C'&& s[i+1]=='M')
            {
                res=res+900;
                i+=2;
                continue;
            }
            else
            {
                switch(s[i])
                {
                    case 'I':res=res+1;i+=1;break;
                    case 'V':res=res+5;i+=1;break;
                    case 'X':res=res+10;i+=1;break;
                    case 'L':res=res+50; i+=1;break;
                    case 'C':res=res+100; i+=1;break;
                    case 'D':res=res+500;  i+=1;break;
                    case 'M':res=res+1000; i+=1;break;
                }
            }


        }
        return res;
    }
};

  更简洁的方法是使用哈希表,一次遍历。但是代码简单了,时间效率却下降了。运行时间仅超过14%的提交。

#include "iostream"
#include "string"
#include "map"
using namespace std;

class Solution {
public:
	int romanToInt(string s)
	{
	   
	    // roman.insert(make_pair('M',1000));
	    map<char,int>roman={{'I',1},{'V',5},{'X',10},{'L',50},{'C',100},{'D',500},	{'M',1000}};
	    int res=0,ans=0;
	    for(int i=0; i<s.length();i++){
	    if(roman[s[i]]<roman[s[i+1]])
	    {
	        res=res+roman[s[i+1]]-roman[s[i]];
	        i++;
	    }
	    else
	    {
	        res=res+roman[s[i]];
	    }
	}
	return res;

	}
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值