13. 罗马数字转整数

简单题目,字符串处理,用了switch-case处理的,为了防止越界问题,for循环的i从1开始,switch从i-1开始判断,这样判断i-1和i位是否是一个整数就不会越界了。最后再判断最后两位是否是一个整数,如果是,在for循环里面就处理了,不是的话,再相加。

用了三个switch-case,代码很长,其实可以使用字典,不用判断直接进行相加。

看了其他人的题解

一、利用罗马数字的特性,如果小数放在大数前面,比如XC,那么它的数值就是C-X=100-10=90,依据此特性,只要在遍历时都与后面一位字符的大小做比较就行了

class Solution{
	public: 
	    int romanToInt(string s) {
        int _size=s.size();
        int index,_int=0;
        for(index=0;;index++){
        	if(index==_size-1){
        		_int+=getNumber(s[index]);//遍历到最后一位时,结束循环。
        		break;
			}
        	if(getNumber(s[index])<getNumber(s[index+1])){
        		_int-=getNumber(s[index]);
			}
			else _int+=getNumber(s[index]);
		}
		return _int;
    }
    int getNumber(char c){
        int num;
        switch(c){
            case 'I':num=1;
                   break;
            case 'V':num=5;
                   break;
            case 'X':num=10;
                   break;
            case 'L':num=50;
                   break;
            case 'C':num=100;
                   break;
            case 'D':num=500;
                   break;
            case 'M':num=1000;
                   break;
        }
        return num;
    }
};

作者:misakasagiri-2
链接:https://leetcode-cn.com/problems/roman-to-integer/solution/yu-hou-yi-wei-zi-fu-bi-jiao-da-xiao-que-ren-dang-q/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

另外一个解法,构建哈希表,C++中哈希表是unordered_map(since C++ 11)

class Solution {
public:
    int romanToInt(string s) {
        unordered_map<string, int> m = {{"I", 1}, {"IV", 3}, {"IX", 8}, {"V", 5}, {"X", 10}, {"XL", 30}, {"XC", 80}, {"L", 50}, {"C", 100}, {"CD", 300}, {"CM", 800}, {"D", 500}, {"M", 1000}};
        int r = m[s.substr(0, 1)];
        for(int i=1; i<s.size(); ++i){
            string two = s.substr(i-1, 2);
            string one = s.substr(i, 1);
            r += m[two] ? m[two] : m[one];
        }
        return r;
    }
};

作者:QQqun902025048
链接:https://leetcode-cn.com/problems/roman-to-integer/solution/2-xing-python-on-by-knifezhu/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值