12. 整数转罗马数字
①if else依次递归
class Solution {
public:
string intToRoman(int num) {//递归
if (num >= 1000)
return "M" + intToRoman(num - 1000);
else if (num >= 900)
return "CM" + intToRoman(num - 900);
else if (num >= 500)
return "D" + intToRoman(num - 500);
else if (num >= 400)
return "CD" + intToRoman(num - 400);
else if (num >= 100)
return "C" + intToRoman(num - 100);
else if (num >= 90)
return "XC" + intToRoman(num - 90);
else if (num >= 50)
return "L" + intToRoman(num - 50);
else if (num >= 40)
return "XL" + intToRoman(num - 40);
else if (num >= 10)
return "X" + intToRoman(num - 10);
else if (num >= 9)
return "IX" + intToRoman(num - 9);
else if (num >= 5)
return "V" + intToRoman(num - 5);
else if (num >= 4)
return "IV" + intToRoman(num - 4);
else if (num >= 1)
return "I" + intToRoman(num - 1);
else
return "";
}
};
②面向结果编程
class Solution {
public:
string intToRoman(int num) {
string thousands[] = {"", "M", "MM", "MMM"};//千位
string hundreds[] = {"", "C", "CC", "CCC", "CD", "D", "DC", "DCC", "DCCC", "CM"};//百位
string tens[] = {"", "X", "XX", "XXX", "XL", "L", "LX", "LXX", "LXXX", "XC"};//十位
string ones[] = {"", "I", "II", "III", "IV", "V", "VI", "VII", "VIII", "IX"};//个位
return thousands[num / 1000] + hundreds[num % 1000 / 100] + tens[num % 100 / 10] + ones[num % 10];
}
};
13. 罗马数字转整数
当前位置的元素比下个位置的元素小,就减去当前值,否则加上当前值
class Solution {
public:
int romanToInt(string s) {
unordered_map<char, int> value = {//键值对记录各字符
{'I', 1}, {'V', 5}, {'X', 10}, {'L', 50},
{'C', 100}, {'D', 500}, {'M', 1000}
};
int ans = 0;
for (int i = 0; i < s.length(); i++) {//当前位置的元素比下个位置的元素小,就减去当前值,否则加上当前值
if (i + 1 < s.length() && value[s[i]] < value[s[i + 1]]) {
ans -= value[s[i]];
} else {
ans += value[s[i]];
}
}
return ans;
}
};