题目描述
class Solution {
public int romanToInt(String s) {
}
}
题目分析
-
读完题目可知,系统给定一个罗马数字的字符串,然后根据这个字符串进行解析转换成整数
-
罗马的多种字符与数字的对应关系可以用
Map存储
或者用条件分支语句判断给值
,主要用于表示对应关系 -
然后根据给定的字符串按位分析
-
但是有一个比较不同寻常的地方,例如
IV
表示4
而不是6
-
其实也就是说
一般情况下小的数字在大的数字的右边,如果小的数字在大的数字的左边,则表示为负数
,也就是减法,知道这种对应关系过后就比较容易解决了
解法分析
- 正常情况下,只需要按位分析字符串的每一个字符的对应整数,然后加上即可
- 但是有特殊情况,就需要稍稍改变一下:
判断字符对应的整数后,需要先判断下一位是比当前位大还是小,如果小或相等则加上,如果大则加上其负数值(即减去)
上代码
- 第一版:比较易读,但是内存消耗稍大
class Solution {
public int romanToInt(String s) {
int sum = 0;
// 最后一位无需判断,直接加上即可,只需要判断前 n-1 位
for(int i = 0; i < s.length()-1; i++){
int num = getValue(s.charAt(i));
int after = getValue(s.charAt(i+1));
if (after > num) {
sum -= num;
}else{
sum += num;
}
}
// 加上最后一位
sum += getValue(s.charAt(s.length()-1));
return sum;
}
private int getValue(char ch) {
switch(ch) {
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;
default: return 0;
}
}
}
- 稍稍改了一下结构:预先获取前一位数字,也就是第一位,然后从第二位开始判断,但是每次加是加前一位,然后将后一位的值赋给前一位,最后循环跳出,再加上最后一位即可
class Solution {
public int romanToInt(String s) {
int sum = 0;
// 先获取第一位
int preNum = getValue(s.charAt(0));
for(int i = 1;i<s.length();i++){
// 获取下一位
int sufNum = getValue(s.charAt(i));
// 判断下一位是否比当前位大
if (sufNum > preNum) {
sum -= preNum;
}else{
sum += preNum;
}
// 赋值
preNum = sufNum;
}
// 加上最后一个数字
sum += preNum;
// 返回结果
return sum;
}
private int getValue(char ch) {
switch(ch) {
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;
default: return 0;
}
}
}