LeetBook刷题笔记004:罗马数字转整数(Java实现)
自己的解(参考别人代码)
class Solution {
public int romanToInt(String s) {
int p=getValue(s.charAt(0)),q=0;
for(int i=1;i<s.length();i++){
//每次获取当前罗马数代指数值
int t=getValue(s.charAt(i));
//与前一位比较判断大小
if(p<t)
q-=p;
else
q+=p;
//更新历史数值
p=t;
}
//注意最后一个字符未添加
return q+p;
}
//使用switch结构比Map数组更快
//将switch结构专门构建函数可实现小范围数据的特殊转换判断
public int getValue(char a){
switch(a){
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;
}
}
}
最优解:模拟
public int romanToInt(String s) {
//使用Map集合存储键值对
Map<Character, Integer> symbolValues = new HashMap<Character, Integer>() {{
put('I', 1);
put('V', 5);
put('X', 10);
put('L', 50);
put('C', 100);
put('D', 500);
put('M', 1000);
}};
int ans = 0;
//提前获取字符串长度,避免每次调用length()函数降低性能
int n = s.length();
for (int i = 0; i < n; ++i) {
//获取当前遍历到的字符对应的值
int value = symbolValues.get(s.charAt(i));
//每次与后一位字符比较
//i<n-1既避免了数组溢出又能操作最后一位字符
if (i<n-1 && value<symbolValues.get(s.charAt(i+1))) {
ans -= value;
} else {
ans += value;
}
}
return ans;
}