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

来源:互联网 发布:手机贴吧抢二楼软件 编辑:程序博客网 时间:2024/06/05 01:12

Given a roman numeral, convert it to an integer.

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

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

/** 罗马数字——阿拉伯数字对照表  */
1XX202XL40
3L504LC905C1006CL1107CD4008D5009DC60010M1000/** 从上述对照表可以发现,基础罗马数字有Ⅰ,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;