LeetCode 0013. Roman to Integer

问题简析

给定一个罗马数字,将其转为整数。

初步思路

分为三部分计算:C放在D,M左右的部分;X放在L,C左右的部分,I放在V,X左右的部分。
1)C放在D,M左右的部分:如果在D,M出现前,C出现了,则C是-100,否则C是100.
2)X放在L, C左右的部分:如果在L,C出现前,X出现了,则X是-10,否则是10.
3)I放在V, X左右的部分:如果在V,X出现前,I出现了,则I是-1,否则是1.

这种思路分几种情况考虑和读取,太繁琐,脑子都搞晕了。显然不是一个easy难度题该有的解法。

更简洁的思路

不需要分多种情况讨论,可以总结为:从左到右读取字符串,如果当前位置字符对应的值小于等于前一个位置字符对应的值,最终值就加上上一个位置字符对应值,否则就减去上一个位置字符对应值。

题解

class Solution {
public:
    int romanToInt(string s) {
        map<char, int> valueMap{ {'I',1}, {'V',5}, {'X',10}, {'L',50}, 
                                    {'C',100}, {'D',500}, {'M',1000} };
        int result = 0;

        for (int i = 1; i < s.size(); i++) {
            if (valueMap[s[i]] <= valueMap[s[i - 1]]) {
                result += valueMap[s[i - 1]];
            }
            else {
                result -= valueMap[s[i - 1]];
            }
        }
        result += valueMap[s[s.size()-1]];

        return result;
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值