题解:
这道题很明显是一道贪心算法的问题,跟找零钱这道题异曲同工之妙,但略有区别,因为它存在 4 = IV 等这种,而不是单纯的 4 = IIII,这是这两道题的最大区别。假如依次分类讨论到底该 IV 还是 IIII 过于麻烦, 有朋友提出了一种思路,很新奇,即将 IV 也看做和 V 一样的单位,此时问题明了了许多,甚是简洁,细节如下:
class Solution {
public:
string intToRoman(int num) {
int j = unitLen - 1;
int tmp = num;
string romanStr = "";
while(tmp && j >= 0){
int t = tmp / unitNum[j];
tmp %= unitNum[j];
while(t--){
romanStr += unitSym[j];
}
j--;
}
return romanStr;
}
private:
const int unitLen = 13;
string unitSym[13] = {"I", "IV", "V", "IX", "X", "XL", "L", "XC", "C", "CD", "D", "CM", "M"};
int unitNum[13] = {1, 4, 5, 9, 10, 40, 50, 90, 100, 400, 500, 900, 1000};
};