LeetCode 刷题【13. 罗马数字转整数、14. 最长公共前缀】
13. 罗马数字转整数
自己做
解法1:遍历
class Solution {
public:int romanToInt(string s) {int len = s.size();int sum = 0;for(int i = len - 1; i >= 0; i--){ if(s[i] == 'I'){ //1sum += 1;}else if(s[i] == 'V'){if(i > 0 && s[i - 1] == 'I'){ //4sum += 4;i--;}elsesum += 5; //5}else if(s[i] == 'X'){if(i > 0 && s[i - 1] == 'I'){ //9sum += 9;i--;}elsesum += 10; //10}else if(s[i] == 'L'){if(i > 0 && s[i - 1] == 'X'){ //40sum += 40;i--;}elsesum += 50; //50}else if(s[i] == 'C'){if(i > 0 && s[i - 1] == 'X'){ //90sum += 90;i--;}elsesum += 100; //100}else if(s[i] == 'D'){if(i > 0 && s[i - 1] == 'C'){ //400sum += 400;i--;}elsesum += 500; //500}else if(s[i] == 'M'){if(i > 0 && s[i - 1] == 'C'){ //900sum += 900;i--;}elsesum += 1000; //1000}}return sum;}
};
解法2:按表映射
不好实现,算了(反正前面已经是最优解了,偷个懒)
看题解
官方用map的代码明显更简洁
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;}
};
14. 最长公共前缀
自己做
两层for循环
看题解
14. 最长公共前缀 - 力扣(LeetCode)
分治这些根本想不到,后面再慢慢学吧