欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2024-02-03 17:07:22
...

Given a roman numeral, convert it to an integer.

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

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

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

1 XX 20
2 XL 40

3 L 50
4 LC 90
5 C 100
6 CL 110
7 CD 400
8 D 500
9 DC 600
10 M 1000
/** 从上述对照表可以发现,基础罗马数字有Ⅰ,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;