LeetCode 13.罗马数字转整数

我的思路:

遍历一遍,遇到相应字符,查看下一个字符,确定值,加和。

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

执行用时 : 40 ms, 在Roman to Integer的C++提交中击败了96.73% 的用户
内存消耗 : 8.3 MB, 在Roman to Integer的C++提交中击败了94.31% 的用户
思路直接,效果一般。

其他人的思路

LeetCode用户脆皮炸鸡的LeetCode题后评论解法。

int romanToInt(char* s) {
    static int hash[128];
    hash['I'] = 1;
    hash['V'] = 5;
    hash['X'] = 10;
    hash['L'] = 50;
    hash['C'] = 100;
    hash['D'] = 500;
    hash['M'] = 1000;
    int result = 0;
    while(*s != 0) {
        if (hash[*s] < hash[*(s+1)]) 
            result -= hash[*s++];
        else 
            result += hash[*s++];
    }
    return result;
}

1 简洁很棒。
2 字符映射很棒。
3 简化了情况的考虑(但可能也存在问题,如IC)。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值