LeetCode_Easy心得:13. Roman to Integer (C语言)

Given a roman numeral, convert it to an integer.

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

/** 题目分析:本题要求输入一组只含有罗马数字的字符串,将字符串转换成阿拉伯数字(范围是1~3999)。*/

/** 罗马数字——阿拉伯数字对照表  */

1XX20
2XL40

3L50
4LC90
5C100
6CL110
7CD400
8D500
9DC600
10M1000
/** 从上述对照表可以发现,基础罗马数字有Ⅰ,V,X,L,C,M,分别对应阿拉伯数字有1,5,10,50,100,1000;接下来就是辨识罗马数字,和阿拉伯数字的从左往右读不同,罗马数字是从右开始看起。如果左边数字大于等于右边的,则相加(例如:Ⅲ是3,Ⅵ是6,DC是600);相反,若左边小于右边,则相减)(例如:Ⅳ是4,Ⅸ9,CD是400)。 */


/** 代码思路:了解了罗马数字辨识之后,回归题目本身。我们输入的是字符串,因为罗马数字从右开始读,所以代码需要先读取字符串中最后一个字符,后再依次向前读取,直至所有字符读取完毕;每次提取的字符与上一次提取的字符进行比较,通过比较来判断运算符号。 */



//toNumber是将基础罗马数字字符Ⅰ,V,X,L,C,M转换成相应的阿拉伯数字;
int toNumber(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;
    }
    return 0;
}

int romanToInt(char s[]) {
   int len, i, ret=0;       

    len = strlen(s);                //变量len表示输入的罗马数字字符长度;
    if(s == 0)  return 0;           //如果输入的字符长度是0,那么返回阿拉伯数字0;
    ret = toNumber(s[len-1]);       //将字符串最后一个字符对应的数字赋给ret,即表示了罗马数字从最右边开始读;
    for(i=len-1; i>0; i--){         //for循环,计数器i不断变小,表示了罗马数字不断向左读;
        if(toNumber(s[i-1]) >= toNumber(s[i]))      //if判断语句,判断左边数字与右边数字的大小关系,从而确定运算符号;
            ret += toNumber(s[i-1]);
        else
            ret -= toNumber(s[i-1]);
    }
    
    return ret;         //返回结果ret;
}



//  LeetCode运行时间:50ms±5ms;



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值