LeetCode 013 Roman to Integer

来源:互联网 发布:tt风扇软件 编辑:程序博客网 时间:2024/05/22 09:00
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.

class Solution {
public:
    int romanToInt(string s) {
    }
};
解题思路:
题目背景解析:
罗马数字共有7个,即I(1)V(5)X(10)L(50)C(100)D(500)M(1000)
具体roman数字表示如下
I
V
X
L
C
D
M
1
5
10
50
100
500
1000
7个字母分别代表不同的数字,用这7个字母排列组成可以组成所有的整数。
简单规则如下:
1、相同的字母或者小的字母在大字母前就是相加。III = 3 IV =6 ;
2、大的字母在小的字母前面就是想减。VI = 4 CM = 900;
  • 自己的解题思路
利用hash进行快速读取,然后从头到尾因此遍历,如果第一次遍历的数,比接下来遍历的数小,则减掉第一次遍历的数值,否则加上。对于最后一位,则是直接加上相应的数值。
  • 别人的解题思路
思路大体一致。
打表法。将Hash表直接换成vector或者数组,进行直接读取。
LL(1)
学习收获:
  • 被大神们的打表法,以及去if神技吓尿;看见LL(1),这样的编译原理的词法分析更直接跪了。
  • LL(1)还没有看懂,其他的都能接受。
附件1:程序
1、自己的程序:
classSolution
{
    public:
    intromanToInt(strings)
    {
        map<char,int>rmaMap={
            {'I',1},
            {'V',5},
            {'X',10},
            {'L',50},
            {'C',100},
            {'D',500},
            {'M',1000}
        };
        intres=0;
        for(string::size_typei=0;i!=s.size();++i)
        {
            autoj=i+1;
            intval=rmaMap[s[i]];
            if(j!=s.size()&&val<rmaMap[s[j]])
            {
                res-=val;
            }
            else
            {
                res+=val;
            }
        }
        returnres;
    }
};
2、别人的程序
打表法
classSolution
{
    public:
    intromanToInt(strings)
    {
        intnum[256]={0};
        intresult=0;
        num['I']=1;num['V']=5;num['X']=10;num['L']=50;
        num['C']=100;num['D']=500;num['M']=1000;
        inti=0;
        while(i<s.size())
        {
            if(num[s[i]]<num[s[i+1]])
                result-=num[s[i]];
            else
                result+=num[s[i]];
            i++;
        }
        returnresult;
    }
};
去掉if-else  具体思路如下:
result = isTrue * ...trueexpression...
         + (1- isTrue) * ...falseexpression...
classSolution
{
    public:
    intromanToInt(strings)
    {
        unordered_map<char,int>romanMap={{'I',1},
        {'V',5},
        {'X',10},
        {'L',50},
        {'C',100},
        {'D',500},
        {'M',1000}};
        intnum=romanMap.at(s.back());
        intprev=num;
        for(inti=s.length()-2;i>=0;--i)
        {
            intcur=romanMap.at(s.at(i));
            intcurLargerThanPrev=cur>=prev;
            num+=(2*curLargerThanPrev-1)*cur;
            prev=cur;
        }
        returnnum;
    }
};
附件2:扩展阅读
参考资料:
  1. https://github.com/githubwoniu/learnprogram/blob/master/leetcode/13/note_ZgblKylin.md
可以仔细看看。分析的优化,以及打表法。
  1. https://github.com/githubwoniu/learnprogram/blob/master/leetcode/13/note_bajdcc.md
介绍一个LL(1)文法的解法。很新颖,需要学习。
0 0
原创粉丝点击