作者 : ThinyuXia
日期 :2021-10-03
题目
理解
其实就是昨天那道题目的逆过程,既然是简单的题目,一定会有优雅的解决方案
题解1(找规律)
1,5,10,50,100,500,1000这7个数字可以直接由单个罗马字符进行转换,关键在于剩余的6个由复合罗马字符代表的数字
规律就是只要当前字符代表的数字小于相邻右边的字符代表的数字,那么这个字符所代表的值就是负值!!!
代码
class Solution {
public int romanToInt(String s) {
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;
int n = s.length();
for (int i = 0; i < n; ++i) {
int value = symbolValues.get(s.charAt(i));
if (i < n - 1 && value < symbolValues.get(s.charAt(i + 1))) {
ans -= value;
} else {
ans += value;
}
}
return ans;
}
}
时间复杂度
:O(n) n是字符串s的长度
空间复杂度
:O(1)