【题号13】题目描述:
给定一个罗马数字,将其转换成整数。
返回的结果要求在 1 到 3999 的范围内。
前置知识:
罗马数字的基本字符有7个:I,V,X,L,C,D,M,分别表示1,5,10,50,100,500,1000;
在构成数字的时候,有下列规则:
1、相同的数字连写,所表示的数等于这些数字相加得到的数,如:Ⅲ = 3;
2、小的数字在大的数字的右边,所表示的数等于这些数字相加得到的数, 如:Ⅷ = 8;Ⅻ = 12;
3、小的数字,(限于Ⅰ、X 和C)在大的数字的左边,所表示的数等于大数减小数得到的数,如:Ⅳ= 4;Ⅸ= 9;
4、正常使用时,连写的数字重复不得超过三次。
解题思路:
如果字符串只有一位,直接输出对应数字;
如果字符串大于一位,需要运用以上4条规则:
从左开始遍历字符串,比较当前字符和下一个字符对应的数值大小(数值分别记为a,b);
如果a≥b,则按照规则1和2,直接累加;
否则,按照规则3,加上b-a,同时i再向右前进一位;
注意:for循环只遍历到数组倒数第二位,最后一位数若未在规则3中被处理掉,则应单独加上。
代码实现:
int arr[90]={},result=0;
// 下面将直接用罗马数字对应的大写字母作数组下标,大写字母的ASCII码对应65~90,故取90,避免溢出
arr['I']=1;
arr['V']=5;
arr['X']=10;
arr['L']=50;
arr['C']=100;
arr['D']=500;
arr['M']=1000;
if(s.length()>1){
for(int i=0;i
if(arr[s[i]]>=arr[s[i+1]]){//对应规则1和2
result+=arr[s[i]];
}
else{
result+=arr[s[i+1]]-arr[s[i]];// 对应规则3
i++;
}
if(i==s.length()-2)
result+=arr[s[i+1]];// 对最后一个字符进行处理
}
}else{
result=arr[s[0]];// 只有一个字符的情况
}
return result;
}
}
领取专属 10元无门槛券
私享最新 技术干货