Leetcode算法练习-easy篇-Roman to Integer

题目简述:

Given a roman numeral, convert it to an integer.

Input is guaranteed to be within the range from 1 to 3999.

上图:

这里写图片描述

本题解法:

int retValue(char a)
{
    if(a == 'M')
        return 1000;
    if(a == 'D')
        return 500;
    if(a == 'C')
        return 100;
    if(a == 'L')
        return 50;
    if(a == 'X')
        return 10;
    if(a == 'V')
        return 5;
    if(a == 'I')
        return 1;
}

int retPra(char a)
{
    int ret = 0;
    if(a == 'M'){
        ret = 7;
        goto End;
    }
    if(a == 'D'){
        ret = 6;
        goto End;
    }
    if(a == 'C'){
        ret = 5;
        goto End;
    }
    if(a == 'L'){
        return 4;
        goto End;
    }
    if(a == 'X'){
        ret = 3;
        goto End;
    }
    if(a == 'V'){
        ret = 2;
        goto End;
    }
    if(a == 'I'){
        ret = 1;
        goto End;
    }
End : 
    return ret;
}

class Solution {
public:
    int romanToInt(string s) {
        int ret = 0;
        int s1 = 0, s2 = 0;
        for(int i = 0; i < s.length(); i++)
        {
            s1 = retPra(s[i]);
            s2 = retPra(s[i + 1]);
            if(s1 < s2)
            {
                ret += retValue(s[i + 1]) - retValue(s[i]);
                i++;
            }
            else
            ret += retValue(s[i]);
        }
        return ret;
    }
};

然后就是再来看一下比较好的解法:
7msJAVA解法

 public int romanToInt(String s) {
    int nums[]=new int[s.length()];
    for(int i=0;i<s.length();i++){
        switch (s.charAt(i)){
            case 'M':
                nums[i]=1000;
                break;
            case 'D':
                nums[i]=500;
                break;
            case 'C':
                nums[i]=100;
                break;
            case 'L':
                nums[i]=50;
                break;
            case 'X' :
                nums[i]=10;
                break;
            case 'V':
                nums[i]=5;
                break;
            case 'I':
                nums[i]=1;
                break;
        }
    }
    int sum=0;
    for(int i=0;i<nums.length-1;i++){
        if(nums[i]<nums[i+1])
            sum-=nums[i];
        else
            sum+=nums[i];
    }
    return sum+nums[nums.length-1];
}

比较高效的部分应该就是直接生成数组,并在数组中进行比较加减。

总结:本次采用C++实现,有意思的部分就是罗马数字的排列方式了,在下面附的是罗马数字的排列规则:(来自百度)

1-10就是: I II III IV V VI VII VIII IX X .
就是一个I代表一根手指表示1.
两个当然就是2.然后V表示的就是一只手也就是5.
然后放在大数左边的小数是减,如IV是4.
放在大数右边的小数是加如VI是6.
然后X表示两只手也就是10.剩下的就跟阿拉伯数字一样组合起来就好了.
20是XX 30是XXX 因为50是L,所以40是XL.然后60LX 70LXX 80LXXX 100是C.所以90是XC.然后十位和个位组合就好了.再附个表

数字排列表格

猜你喜欢

转载自blog.csdn.net/fair_angle/article/details/70768234
今日推荐