题目
题目在这
这是一道简单等级的题目。
AC代码
这是我的思路,就是按照题中给的意思,一行代码一行代码地撸出来的,显得很笨。
class Solution {
public:
int romanToInt(string s) {
int len = s.size();
map<char, int> m;
m['I'] = 1;
m['V'] = 5;
m['X'] = 10;
m['L'] = 50;
m['C'] = 100;
m['D'] = 500;
m['M'] = 1000;
int res = 0;
for (int i = 0; i < len; ++i) {
if (s[i] == 'I') {
if (s[i + 1] == 'V') {
res += 4;
++i;
} else if (s[i + 1] == 'X') {
res += 9;
++i;
} else {
res += 1;
}
continue;
} else if (s[i] == 'X') {
if (s[i + 1] == 'L') {
res += 40;
++i;
} else if (s[i + 1] == 'C') {
res += 90;
++i;
} else {
res += 10;
}
continue;
} else if (s[i] == 'C') {
if (s[i + 1] == 'D') {
res += 400;
++i;
} else if (s[i + 1] == 'M') {
res += 900;
++i;
} else {
res += 100;
}
continue;
}
res += m[s[i]];
}
return res;
}
};
改进代码,让代码更简洁。
观察可以发现无非是IV、XL类型的罗马数字我们无法一次性搞明白。但是发现如果是第一个数对应的数字比第二个数对应的数字小,那么在res中将其减去即可,这样就省去了大量的if else语句。
(听说用switch case语句会更快哟~)
class Solution {
private://私有的
unordered_map<char, int> symbolValues = {
//unordered_map比map对于单个元素的访问效率高
{'I', 1},
{'V', 5},
{'X', 10},
{'L', 50},
{'C', 100},
{'D', 500},
{'M', 1000},
};//map可以像python中字典一样的生成
public:
int romanToInt(string s) {
int res = 0;
int n = s.size();
for (int i = 0; i < n; ++i) {
int value = symbolValues[s[i]];
if (i < n - 1 && value < symbolValues[s[i + 1]]) {
res -= value;
} else {
res += value;
}
}
return res;
}
};
总结
目前做题很容易直接按照题目来一步一步的模拟,不去发现一些规律来写。所以以后做题的时候遇见要大量重复代码的,就可以找一找内在的一些规律,使代码更加的简洁。