Leecode 将罗马数字转换为整型
Day 1 刷题
- 我的解题思路利用罗马数字与整型的转换规律,利用哈希表来生成键值对。
class Solution {
public int romanToInt(String s) {
int sum = 0;
HashMap<Character, Integer> RomanInt = new HashMap<Character, Integer>();
RomanInt.put('I',1);
RomanInt.put('V',5);
RomanInt.put('X',10);
RomanInt.put('L',50);
RomanInt.put('C',100);
RomanInt.put('D',500);
RomanInt.put('M',1000);
// directly sum up all the elemnts with no exceotion
int n = s.length();
for(int i=0;i<n-1;i++)
{
char romankey = s.charAt(i);
char nextkey = s.charAt(i+1);
if(RomanInt.get(romankey)>=RomanInt.get(nextkey)){
sum = RomanInt.get(romankey)+sum;
}
else{
sum = sum-RomanInt.get(romankey);
}
}
char FinalKey = s.charAt(n-1);
sum = sum + RomanInt.get(FinalKey);
return sum;
}
}
- DoneSpeak解法:通过定义方法getValue()来避免创建哈希表,定义变量preNum来存储前一个数,同时注意加的是prenum(检测完成是否比后一个数小,不然就要减掉)。
import java.util.*;
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 num = getValue(s.charAt(i));
if(preNum < num) {
sum -= preNum;
} else {
sum += preNum;
}
preNum = num;
}
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;
}
}
}
空间复杂度更小,同时不必要多考虑最后一数值的增加(我的代码的瑕疵)。