Question :
Given a roman numeral, convert it to an integer.
Input is guaranteed to be within the range from 1 to 3999.
My Solution :
Java 代码:
class Solution {
public int romanToInt(String s) {
int[] values = {1000,900,500,400,100,90,50,40,10,9,5,4,1};
String[] strs = {"M","CM","D","CD","C","XC","L","XL","X","IX","V","IV","I"};
HashMap<String, Integer> RomanToIntHashTable = new HashMap<>();
for (int i = 0; i < values.length; i++) {
RomanToIntHashTable.put(strs[i], values[i]);
}
int result = 0;
for (int i = 0; i < s.length(); i++) {
if (i < s.length() - 1 && RomanToIntHashTable.get(s.substring(i, i + 1)) < RomanToIntHashTable.get(s.substring(i + 1, i + 2))) {
result += RomanToIntHashTable.get(s.substring(i, i + 2));
i ++;
} else {
result += RomanToIntHashTable.get(s.substring(i, i + 1));
}
}
return result;
}
}
使用hashtable降低了复杂度
时间复杂度为O(n)
Other Solution :
C++ 代码
unordered_map<char, int> T = { { 'I' , 1 },
{ 'V' , 5 },
{ 'X' , 10 },
{ 'L' , 50 },
{ 'C' , 100 },
{ 'D' , 500 },
{ 'M' , 1000 } };
int sum = T[s.back()];
for (int i = s.length() - 2; i >= 0; --i)
{
if (T[s[i]] < T[s[i + 1]])
{
sum -= T[s[i]];
}
else
{
sum += T[s[i]];
}
}
return sum;