【Leetcode长征系列】Roman to Integer && Integer to Roman

原题:

Given a roman numeral, convert it to an integer.

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

I - 1
V - 5
X - 10
L - 50
C - 100
D - 500
M - 1000
If a lower value symbol is before a higher value one, it is subtracted. Otherwise it is added.
So 'IV' is '4' and 'VI' is '6'.
For the numbers above X, only the symbol right before it may be subtracted: so 99 is: XCIX (and not IC).

相同的数字连写,所表示的数等于这些数字相加得到的数,例如:III = 3

小的数字在大的数字右边,所表示的数等于这些数字相加得到的数,例如:VIII = 8

小的数字,限于(I、X和C)在大的数字左边,所表示的数等于大数减去小数所得的数,例如:IV = 4

正常使用时,连续的数字重复不得超过三次在一个数的上面画横线,表示这个数扩大1000倍(本题只考虑3999以内的数,所以用不到这条规则)


思路:知道了罗马数字的表现规则后就很好办了。关于如何存储罗马数字与数字的对应关系,网上有的人用switch来返回int值,新建一个函数。但实际上STL里已经给我们提供了一个非常好的方法,map。

class Solution {
public:
    int romanToInt(string s) {
        map<char,int> m;  
        m['I'] = 1;  
        m['V'] = 5;  
        m['X'] = 10;  
        m['L'] = 50;  
        m['C'] = 100;  
        m['D'] = 500;  
        m['M'] = 1000;  
        
        int len = s.length();
        if(len<0) return -1;
        int sum = m[s[len-1]];
        
        for (int i = len-2; i>=0; i--){
            if(m[s[i]]<m[s[i+1]]) sum-=m[s[i]] ;
            else sum +=m[s[i]];
        }
        return sum;
        
    }
};

AC了,这里需要注意i=0的情况!

=================================================================================================================================

原题:

Given an integer, convert it to a roman numeral.

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

比较现有数字与values数组里的值(从大到小),减去一个values的值增加一个对应位置的numeral符号。

class Solution {
public:
    string intToRoman(int num) {
        int values[] = {1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1};
        string numerals[] = {"M", "CM", "D", "CD", "C", "XC", "L", "XL", "X", "IX", "V", "IV", "I" };
        string res="";
        
        for(int i = 0;  i<13 ; i++){
            while(values[i]<=num && num!=0){
                num -= values[i];
                res = res+numerals[i];
            }
        }
        return res;
    }
};





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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值