[LeetCode13]Roman to Integer

Given a roman numeral, convert it to an integer.

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

Analysis:

According to the rules from wiki:
A number written in Arabic numerals can be broken into digits. For example, 1903 is composed of 1 (one thousand), 9 (nine hundreds), 0 (zero tens), and 3 (three units). To write the Roman numeral, each of the non-zero digits should be treated separately. In the above example, 1,000 = M, 900 = CM, and 3 = III. Therefore, 1903 = MCMIII.[4]
The symbols "I", "X", "C", and "M" can be repeated three times in succession, but no more. (They may appear more than three times if they appear non-sequentially, such as XXXIX.) "D", "L", and "V" can never be repeated.[5][6]
"I" can be subtracted from "V" and "X" only. "X" can be subtracted from "L" and "C" only. "C" can be subtracted from "D" and "M" only. "V", "L", and "D" can never be subtracted[6]
Only one small-value symbol may be subtracted from any large-value symbol.[7]

The idea is to scan from left to right, if digit[current]>digit[current-1], add difference value to the result. else add digit[current] to the result

Java

public int RoToIn(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;
		}
	}
    public int romanToInt(String s) {
        // IMPORTANT: Please reset any member data you declared, as
        // the same Solution instance will be reused for each test case.
         int result = 0;
        for(int i=0; i<s.length(); i++){
        	if(i>0 && RoToIn(s.charAt(i))>RoToIn(s.charAt(i-1)))
        		result += RoToIn(s.charAt(i)) - 2*RoToIn(s.charAt(i-1));
        	else 
        		result += RoToIn(s.charAt(i));
        }
        return result;
    }
c++

inline int c2n(char c){//inline function
    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;
    }
}
int romanToInt(string s) {
    int result=0;
    for(int i=0;i<s.size();i++){
        if(i>0 && c2n(s[i])>c2n(s[i-1])){
            result += (c2n(s[i])-2*c2n(s[i-1]));
        }else{
            result+=c2n(s[i]);
        }
    }
    return result;
}





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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值