/**
* 罗马数字包含以下七种字符: I, V, X, L,C,D 和 M。
*
* 字符 数值
* I 1
* V 5
* X 10
* L 50
* C 100
* D 500
* M 1000
* 例如, 罗马数字 2 写做 II ,即为两个并列的 1。
* 12 写做 XII ,即为 X + II 。
* 27 写做 XXVII, 即为 XX + V + II 。
*
* 通常情况下,罗马数字中小的数字在大的数字的右边。
* 但也存在特例,例如 4 不写做 IIII,而是 IV。
* 数字 1 在数字 5 的左边,所表示的数等于大数 5 减小数 1 得到的数值 4 。
* 同样地,数字 9 表示为 IX。这个特殊的规则只适用于以下六种情况:
*
* 给定一个罗马数字,将其转换成整数。输入确保在 1 到 3999 的范围内。
*/
//思路分析
//1. 因为是罗马数字转整数,因此要先编写一个方法,根据罗马字符获取到整数的大小
//2. 由要求很容易发现罗马数字转整数的规律,即为如果一个小字符在大字符的前边,那么做减法
// 否则做加法
//3. 遍历这个包含罗马字符的字符串,依次将拿到的字符相加减
//4. 最后返回计算的结果
public int romanToInt(String s) {
//数据校验
if (s == null || s.length() == 0){
return 0;
}
//定义一个变量保存字符串的第一个字符所对应的整数大小
int preNum = getValueByRoman(s.charAt(0));
//定义一个变量sum保存计算的和
int sum = 0;
//遍历这个字符串的所有字符并计算
for (int i = 1; i < s.length(); i++) {
//定义临时变量保存当前此遍历拿到的罗马字符对应的数字大小
int temp = getValueByRoman(s.charAt(i));
//判断这个数和前一个数字的大小
//如果这个数字大于前变的数字,执行减的操作
if (temp > preNum){
sum -= preNum;
//如果这个数字小于或等于前边的数字,执行加的操作
}else {
sum += preNum;
}
//计算完一次之后重置preNum的值,即preNum向后移动一位
preNum = temp;
}
//循环结束后preNum指向最后一个字符对应的数字,但是循环已经结束,perNum还没有加入
sum += preNum;
return sum;
}
//编写方法根据罗马字符拿到对应的整数,可以考虑使用switch来完成,也可以使用散列表
public int getValueByRoman(char c){
//定义变量保存返回的结果
int res = 0;
switch (c){
case ‘I‘:
res = 1;
break;
case ‘V‘:
res = 5;
break;
case ‘X‘:
res = 10;
break;
case ‘L‘:
res = 50;
break;
case ‘C‘:
res = 100;
break;
case ‘D‘:
res = 500;
break;
case ‘M‘:
res = 1000;
break;
}
return res;
}
原文:https://www.cnblogs.com/mx-info/p/14747204.html