暴力(本方法)
主要注意这三个特殊存在就好了,其他的就是累加起来,可以用hashmap,只要能映射起来就好了
class Solution {
public int romanToInt(String str){
if (str == null) return 0;
int[] arr = new int[97];
char[] roman = {'I','V','X','L','C','D','M'};
int[] ints = {1,5,10,50,100,500,1000};
for (int i = 0; i < roman.length; i++) {
arr[roman[i]] = ints[i];
}
char[] chars = str.toCharArray();
int index = 0;
int sum = 0;
while (index < chars.length){
if (index + 1 <= chars.length - 1 && chars[index] == 'I'){
if (chars[index + 1] == 'V' || chars[index + 1] == 'X'){
sum -= 1;
index++;
}
}
else if (index + 1 <= chars.length - 1 && chars[index] == 'X'){
if (chars[index + 1] == 'L' || chars[index + 1] == 'C'){
sum -= 10;
index++;
}
}
else if (index + 1 <= chars.length - 1 && chars[index] == 'C'){
if (chars[index + 1] == 'D' || chars[index + 1] == 'M'){
sum -= 100;
index++;
}
}
sum += arr[chars[index++]];
}
return sum;
}
}
这个方法就是时间基本都差不多的
也可以把核心代码优化一下
while (index < chars.length){
if (index + 1 <= chars.length - 1 && arr[chars[index]] < arr[chars[index + 1]]){
sum -= arr[chars[index++]];
}
sum += arr[chars[index++]];
}
因为它字符串的排列顺序使从大到小的,所以只要有小于后面一个数的,就是要减的数
当然,也可以全部累加,然后使用字符匹配的方法,拿到有多少个减数,再把这些减数减掉就行。
放一个最终版
class Solution {
public int romanToInt(String str){
if (str == null) return 0;
int[] arr = new int[97];
char[] roman = {'I','V','X','L','C','D','M'};
int[] ints = {1,5,10,50,100,500,1000};
for (int i = 0; i < roman.length; i++) {
arr[roman[i]] = ints[i];
}
char[] chars = str.toCharArray();
int index = 0;
int sum = 0;
while (index < chars.length){
if (index + 1 <= chars.length - 1 && arr[chars[index]] < arr[chars[index + 1]]){
sum -= arr[chars[index++]];
}
sum += arr[chars[index++]];
}
return sum;
}
}