1 题目:
Given a roman numeral, convert it to an integer.
Input is guaranteed to be within the range from 1 to 3999.
2 思路
和上一道反过来,好吧,但是思路不一样。
我写的代码思路一样,要考虑一些特殊情况,比较复杂。
别人代码的思路倒是不错: 下面的那个思路,倒序遍历,如果大于5或50或500,那么就是减了,否则就是加。罗马数字小数字在左边是减,且仅限一位。
https://leetcode.com/discuss/2369/solution-for-this-question-but-dont-know-there-any-easier-way
这个是用 哈希函数实现的,我也想过用哈希函数,但是不是这样的,我想的是那个数组全部哈希一遍- -。
https://leetcode.com/discuss/23778/my-accepted-java-code-280-310ms
3 代码:
我的
public int romanToInt(String s) {
String[] M = {"","M","MM","MMM"};
String[] C = {"","C","CC","CCC","D","CD","DC","DCC","DCCC","CM"};
String[] X = {"","X","XX","XXX","L","XL","LX","LXX","LXXX","XC"};
String[] V = {"","I","II","III","V","IV","VI","VII","VIII","IX"};
int num = 0;
for(int i = M.length-1; i>=0 ; i--){
if(s.startsWith(M[i])){
num = num + i*1000;
s = s.substring(i);
break;
}
}
for(int j = C.length-1; j>=0; j--){
if(s.startsWith(C[j])){
s = s.substring(C[j].length()); //5和4要反过来,先检测CD再检测D,反之,就检测不到D了
if(j==5) j = 4;
else if( j==4) j=5;
num = num + j*100;
break;
}
}
for(int k = X.length-1; k>=0;k--){
if(s.startsWith(X[k])){
s = s.substring(X[k].length());
if(k==5) k = 4;
else if( k==4) k=5;
num = num + k*10;
break;
}
}
for(int i = V.length-1; i>=0; i--){
if(s.startsWith(V[i])){
if(i==5) i = 4;
else if( i==4) i=5;
num = num + i;
break;
}
}
return num;
}
好的思路:
public static int romanToInt(String s) {
int res = 0;
for (int i = s.length() - 1; i >= 0; i--) {
char c = s.charAt(i);
switch (c) {
case 'I':
res += (res >= 5 ? -1 : 1);
break;
case 'V':
res += 5;
break;
case 'X':
res += 10 * (res >= 50 ? -1 : 1);
break;
case 'L':
res += 50;
break;
case 'C':
res += 100 * (res >= 500 ? -1 : 1);
break;
case 'D':
res += 500;
break;
case 'M':
res += 1000;
break;
}
}
return res;
}
哈希函数:
public class Solution {
private static final Map<Character, Integer> maps = new HashMap<>();
static{
maps.put('I', 1);
maps.put('V', 5);
maps.put('X', 10);
maps.put('L', 50);
maps.put('C', 100);
maps.put('D', 500);
maps.put('M', 1000);
}
public int romanToInt(String s) {
int previousNum = maps.get(s.charAt(0));
int result = maps.get(s.charAt(0));
for (int i = 1; i < s.length(); i++){
if (previousNum < maps.get(s.charAt(i))){
result = result - (2*previousNum);
}
previousNum = maps.get(s.charAt(i));
result += previousNum;
}
return result;
}
}
来源:https://www.cnblogs.com/lingtingvfengsheng/p/4567207.html