标签:
问题描述:
Given a roman numeral, convert it to an integer.
Input is guaranteed to be within the range from 1 to 3999.
这个比之前的Integer To Roman还要简单一些,罗马数字转换到整数的话,举个一般的例子,LXVI==50+10+5+1==66,再举个例子,LXIV==50+10+(5-1)==64。基本上我们只要对第二个例子的情况做一些处理就好了。
int romanToInt(char* s) { int i=0,j=0,num=0; char roman[7]={‘M‘,‘D‘,‘C‘,‘L‘,‘X‘,‘V‘,‘I‘}; int value[7]={1000,500,100,50,10,5,1}; while(s[i]!=‘\0‘){ while(s[i]!=roman[j]) j++; if((j-1>=0&&s[i+1]==roman[j-1])||(j-2>=0&&s[i+1]==roman[j-2])){ if(s[i+1]==roman[j-1]) num+=value[j-1]-value[j]; else num+=value[j-2]-value[j]; i++; } else num+=value[j]; i++; } return num; }
我注意到这个算法下IIV(应该不是合法的罗马数字)的值将是1+(5-1)==5。而LeetCode给出的expected answer是3,也就是5-(2*1),所以我又写了另一个版本。
int romanToInt(char* s) { int i=0,j=0,num=0,rp=1; char roman[7]={‘M‘,‘D‘,‘C‘,‘L‘,‘X‘,‘V‘,‘I‘}; int value[7]={1000,500,100,50,10,5,1}; while(s[i]!=‘\0‘){ rp=1; while(s[i]!=roman[j]) j++; while(s[i]==s[i+1]){ rp++; i++; } if((j-1>=0&&s[i+1]==roman[j-1])||(j-2>=0&&s[i+1]==roman[j-2])){ if(s[i+1]==roman[j-1]) num+=value[j-1]-rp*value[j]; else num+=value[j-2]-rp*value[j]; i++; } else num+=rp*value[j]; i++; } return num; }
也就是多了一个rp(repeat)变量来处理连续出现的罗马字符数。
标签:
原文地址:http://www.cnblogs.com/evilkant/p/5975365.html