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:扩展阅读
参考资料:
- https://github.com/githubwoniu/learnprogram/blob/master/leetcode/13/note_ZgblKylin.md
可以仔细看看。分析的优化,以及打表法。
- https://github.com/githubwoniu/learnprogram/blob/master/leetcode/13/note_bajdcc.md
介绍一个LL(1)文法的解法。很新颖,需要学习。
0 0
- LeetCode 013 Roman to Integer
- [LeetCode]013-Roman to Integer
- LeetCode 013 Roman to Integer
- leetcode-013-Roman to Integer
- LeetCode 013 Roman to Integer
- LeetCode-013 Roman to Integer
- LeetCode Roman to Integer && Integer to Roman
- 【leetcode】Roman to Integer | Integer to Roman
- Leetcode - "Roman to Integer" & "Integer to Roman"
- LeetCode:Roman to Integer,Integer to Roman
- LeetCode Integer to Roman & Roman to Integer
- leetcode - roman to integer & integer to roman
- LeetCode:Roman to Integer
- LeetCode: Integer to Roman
- LeetCode: Roman to Integer
- LeetCode Integer to Roman
- LeetCode: Integer to Roman
- LeetCode : Roman to Integer
- 上传文件到Linux系统的方法
- linux shell命令行选项与参数用法详解
- 项目实战-sokoban
- 随手记(2)-java.sql.SQLException: [Microsoft][ODBC 驱动程序管理器] 未发现数据源名称并且未指定默认驱动程序
- Java String.split()用法小结
- LeetCode 013 Roman to Integer
- 一般处理文件ASHX中使用取不到SESSION
- windows 下查找某个端口号对应的进程并杀死
- Linux文档大全
- Java多线程Thread VS Runnable详解
- iOS Smart App Banner 智能App广告条
- HTTP协议浅析(上):简介
- UART0串口编程系列(一)
- 数组