13. Roman to Integer
2016-03-21 19:55
274 查看
1.Question
Given a roman numeral, convert it to an integer.
Input is guaranteed to be within the range from 1 to 3999.
2.Code
codeA
codeB
3.Note
a. codeA 利用一个哈希表来将字母和数字进行映射, codeB 通过swich case 来映射。在leetcode 上 codeB 要比 codeA 快一倍。
b. 本题思想是根据罗马数字的规律,“小数”组合最多只能由两个罗马数字组成,所以我们每次检测相邻的两个罗马数字就好了,如果是“小数”则当“小数”处理,如果不是“小数”,则把当前罗马数字当单个罗马数字处理就好了。还有一点要考虑的是最后罗马数字的情况。
c. 其实还有一种更简洁的做法,一次遍历就可以了。就是遍历罗马数字,如果当前罗马数字比后一个数大,则 sum+= 当前罗马数字,如果当前罗马数字比后一个数小,则 sum-= 当前罗马数字。这个解法更简洁,他满足罗马数字的分布条件。
d. 头文件<unordered_map>,<string>.
Given a roman numeral, convert it to an integer.
Input is guaranteed to be within the range from 1 to 3999.
2.Code
codeA
class Solution { public: int romanToInt(string s) { unordered_map<char,int> map; map['I'] = 1; map['V'] = 5; map['X'] = 10; map['L'] = 50; map['C'] = 100; map['D'] = 500; map['M'] = 1000; int sum = 0; for(int i = 0; i < s.size(); i++) { if(i == s.size() - 1) sum += map[s[i]]; else { if(map[s[i]] < map[s[i+1]]) { sum += map[s[i+1]] - map[s[i]]; i++; } else sum += map[s[i]]; } } return sum; } };
codeB
class Solution { public: int romanToInt(string s) { int sum = 0; for(int i = 0; i < s.size(); i++) { int s1 = sigleRomanToInt(s[i]), s2 = sigleRomanToInt(s[i+1]); if(s1 < s2) { sum += s2 - s1; i++; } else sum += s1; } return sum; } int sigleRomanToInt(char c){ switch(c) { case 'I' : return 1; case 'V' : return 5; case 'X' : return 10; case 'L' : return 50; case 'C' : return 100; case 'D' : return 500; case 'M' : return 1000; default : return 0; } } };
3.Note
a. codeA 利用一个哈希表来将字母和数字进行映射, codeB 通过swich case 来映射。在leetcode 上 codeB 要比 codeA 快一倍。
b. 本题思想是根据罗马数字的规律,“小数”组合最多只能由两个罗马数字组成,所以我们每次检测相邻的两个罗马数字就好了,如果是“小数”则当“小数”处理,如果不是“小数”,则把当前罗马数字当单个罗马数字处理就好了。还有一点要考虑的是最后罗马数字的情况。
c. 其实还有一种更简洁的做法,一次遍历就可以了。就是遍历罗马数字,如果当前罗马数字比后一个数大,则 sum+= 当前罗马数字,如果当前罗马数字比后一个数小,则 sum-= 当前罗马数字。这个解法更简洁,他满足罗马数字的分布条件。
d. 头文件<unordered_map>,<string>.
相关文章推荐
- 第十二讲--logbuffer相关设置
- [Poj 2488] A Knight's Journey
- 2530: 小勇玩lol
- spring中的依赖注入和控制反转(二)——Spring 设值注入和构造注入比较
- oracle 10g正则表达式 REGEXP_LIKE 用法
- java语言程序设计第十版(Introduce to java) 课后习题 chapter6-23
- mybatis3中注解方式使用mapper
- 2016SDAU课程练习一1004
- [针对初学者]Cocos 瞎搞小技巧2
- CF645E-Intellectual Inquiry 贪心
- [Poj 1321] 棋盘问题 dfs
- 解决初次登录MySQL出现ERROR 1045 (28000):Access denied for user 'root'@'localhost'问题
- 广播的两种注册方法以及区别
- 驱动开发之 一个简单的截取键盘按键的驱动
- BZOJ1565: [NOI2009]植物大战僵尸
- 学习java心得 二
- HDU 1452 Happy 2004 (逆元+快速幂+积性函数)
- android R文件丢失解决方法
- java设置守护线程
- [Poj 3009] Curling 2.0 深搜