我的解法
感觉是字符串处理
class Solution {
public int romanToInt(String s) {
int ans = 0; for(int i = 0;i < s.length(); i){
if(s.charAt(i) == 'I') ans = 1; if(s.charAt(i) == 'V'){
if(i != 0 && s.charAt(i-1)=='I') ans = 3; else ans = 5; } if(s.charAt(i) == 'X'){
if(i != 0 && s.charAt(i-1) == 'I') ans = 8; else ans = 10; } if(s.charAt(i) == 'L'){
if(i != 0 && s.charAt(i-1) == 'X')
ans += 30;
else
ans += 50;
}
if(s.charAt(i) == 'C'){
if(i != 0 && s.charAt(i-1) == 'X')
ans += 80;
else
ans += 100;
}
if(s.charAt(i) == 'D'){
if(i != 0 && s.charAt(i-1) == 'C')
ans += 300;
else
ans += 500;
}
if(s.charAt(i) == 'M'){
if(i != 0 && s.charAt(i-1) == 'C')
ans += 800;
else
ans += 1000;
}
}
return ans;
}
}
正着需要“回顾”前一个字符,倒着需要“回顾”后一个字符,比如左边是 I
,则减1,否则加1.
class Solution {
public int romanToInt(String s) {
int ans = 0;
char pre = '/';
for(int i = s.length()-1;i >= 0;--i){
if(s.charAt(i) == 'I'){
if(pre == 'V' || pre == 'X'){
ans -= 1;
}else
ans += 1;
}
// ans += 1;
if(s.charAt(i) == 'V'){
ans += 5;
// if(i != 0 && s.charAt(i-1)=='I')
// ans += 3;
// else
// ans += 5;
}
if(s.charAt(i) == 'X'){
if(pre == 'L' || pre == 'C')
ans -= 10;
else
ans += 10;
// if(i != 0 && s.charAt(i-1) == 'I')
// ans += 8;
// else
// ans += 10;
}
if(s.charAt(i) == 'L'){
ans += 50;
// if(i != 0 && s.charAt(i-1) == 'X')
// ans += 30;
// else
// ans += 50;
}
if(s.charAt(i) == 'C'){
if(pre == 'D' || pre == 'M')
ans -= 100;
else
ans += 100;
// if(i != 0 && s.charAt(i-1) == 'X')
// ans += 80;
// else
// ans += 100;
}
if(s.charAt(i) == 'D'){
ans += 500;
// if(i != 0 && s.charAt(i-1) == 'C')
// ans += 300;
// else
// ans += 500;
}
if(s.charAt(i) == 'M'){
ans += 1000;
// if(i != 0 && s.charAt(i-1) == 'C')
// ans += 800;
// else
// ans += 1000;
}
pre = s.charAt(i);
}
return ans;
}
}
倒着比正着快一点
题解
class Solution {
private:
unordered_map<char, int> symbolValues = {
{
'I', 1},
{
'V', 5},
{
'X', 10},
{
'L', 50},
{
'C', 100},
{
'D', 500},
{
'M', 1000},
};
public:
int romanToInt(string s) {
int ans = 0;
int n = s.length();
for (int i = 0; i < n; ++i) {
int value = symbolValues[s[i]];
if (i < n - 1 && value < symbolValues[s[i + 1]]) {
ans -= value;
} else {
ans += value;
}
}
return ans;
}
};
作者:LeetCode-Solution
链接:https://leetcode-cn.com/problems/roman-to-integer/solution/luo-ma-shu-zi-zhuan-zheng-shu-by-leetcod-w55p/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
他默认输入合法序列(即不存在 ID
这种情况),所以左逢 I
必减1,否则必加1。X
,C
同理。