給定一個範圍在 1 到 3999 之間的整數,將其轉換為羅馬數字表示。羅馬數字規則:
將所有可能的「值-符號」對按值從大到小排序:
int value[] = {1000,900,500,400,100,90,50,40,10,9,5,4,1};
string symbol[] = {"M","CM","D","CD","C","XC","L","XL","X","IX","V","IV","I"};
從最大值開始,只要 num >= value[i],就將對應符號加入結果,並 num -= value[i],重複直到 num == 0。這本質上是貪心策略,因為羅馬數字系統保證了這樣的拆分唯一且最優。
class Solution {
public:
string intToRoman(int num) {
string res;
vector val = {1000,900,500,400,100,90,50,40,10,9,5,4,1};
vector sym = {"M","CM","D","CD","C","XC","L","XL","X","IX","V","IV","I"};
for (int i = 0; num > 0; ++i) {
while (num >= val[i]) {
num -= val[i];
res += sym[i];
}
}
return res;
}
};
時間 O(1)(符號表固定長度 13),空間 O(1)。