leetcode: (13) Roman to Integer

QuestionRoman to Integer

Given a roman numeral, convert it to an integer. Or, Given an integer, convert it to a roman numeral.

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

Roman numbers

1~9: {"I", "II", "III", "IV", "V", "VI", "VII", "VIII", "IX"};

10~90: {"X", "XX", "XXX", "XL", "L", "LX", "LXX", "LXXX", "XC"};

100~900: {"C", "CC", "CCC", "CD", "D", "DC", "DCC", "DCCC", "CM"};

1000~3000: {"M", "MM", "MMM"}.

Method 1: Just using if (C language)

int romanToInt(char* s) {
    int len = strlen(s);
    int result=0;
    int i=0;
    while(len)
    {
       if(s[i]=='M')
       {result+=1000;i++;len--;}
       else if(s[i]=='C')
       {
           if(s[i+1]=='D'){result+=400;i+=2;len-=2;}
           else if(s[i+1]=='M'){result+=900;i+=2;len-=2;}
           else {result+=100;i++;len--;}
       }
       else if(s[i]=='D') {result+=500;i++;len--;}
       else if(s[i]=='X')
       {
          if(s[i+1]=='C'){result+=90;i+=2;len-=2;}
          else if(s[i+1]=='L'){result+=40;i+=2;len-=2;}
          else {result+=10;i++;len--;}
       }
       else if(s[i]=='L')  { result+=50;i++;len--;}
       else if(s[i]=='I')
       {
          if(s[i+1]=='X'){result+=9;i+=2;len-=2;}
          else if(s[i+1]=='V'){result+=4;i+=2;len-=2;}
          else {result+=1;i++;len--;}
       }
       else if(s[i]=='V'){ result+=5;i++;len--; }}
   return result;
}
Method 2:  We can find “4,9,40,90,400,900” =s[i]-s[i-1]. And they apprear if s[i]>s[i-1];
class Solution {
public:
    int romanToInt(string s) {
        int result = romanCharToInt(s[0]);
        for(int i=1;i<s.size();i++)
        {
            if(romanCharToInt(s[i])>romanCharToInt(s[i-1]))
            {
                result+=romanCharToInt(s[i])-2*romanCharToInt(s[i-1]);
            }
            else{result+=romanCharToInt(s[i]);}
        }
        return result;
    }
    
    int romanCharToInt(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;
        }
    }
};

JAVA

<span style="font-size:12px;">public class Solution {
    public int romanToInt(String s) {
        int result = romanCharToInt(s.charAt(0));
        for(int i=1;i<s.length();i++)
        {
            if(romanCharToInt(s.charAt(i))>romanCharToInt(s.charAt(i-1)))
            {
                result+=romanCharToInt(s.charAt(i))-2*romanCharToInt(s.charAt(i-1));
            }
            else{result+=romanCharToInt(s.charAt(i));}
        }
        return result;
    }
    
    public int romanCharToInt(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;
        }
    }
}</span>
Python language

class Solution(object):
    def romanToInt(self, s):
        digits = { "I":1, "V":5, "X":10, "L":50, "C":100, "D":500, "M":1000 }
        len_s = len(s)
        num = 0
        for i in range(0, len_s - 1):
            current = digits[s[i]]
            next = digits[s[i + 1]]
            if current >= next:
                num += current
            else:
                num -= current
        num += digits[s[len_s - 1]]
        return num




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值