LeetCode 12. Integer to Roman
阿新 • • 發佈:2018-03-11
大數 所有 轉換成 ber lee org 轉換 基本 class
問題鏈接
LeetCode 12. Integer to Roman
題目解析
將普通數字轉換成羅馬數字。
解題思路
先簡單了解一下什麽是羅馬數字。
基本字符:I,V,X,L,C,D,M
相應的阿拉伯數字表示為:1,5,10,50,100,500,1000
- 相同的數字連寫、所表示的數等於這些數字相加得到的數、如:Ⅲ=3;
- 小的數字在大的數字的右邊、所表示的數等於這些數字相加得到的數、 如:Ⅷ=8、Ⅻ=12;
- 小的數字(限於 I、X 和 C)在大的數字的左邊、所表示的數等於大數減小數得到的數、如:Ⅳ=4、Ⅸ=9;
- 正常使用時、連寫的數字重復不得超過三次;
- 在一個數的上面畫一條橫線、表示這個數擴大 1000 倍。
這道題比上一題LeetCode 13. Roman to Integer難一些,需要知道一些特性。由於題目的輸入範圍只在1~3999,並不是很大,所以本題有多種解法。
先講最正規的做法,其實羅馬數字也是按位來表示數字的,我們只要提取出每一位上的數字,就可以用固定的羅馬數字表示它。比如:(100,C)、(200,CC)、(300,CCC)、(400,CD)、(500,D)、(600,DC)、(700,DCC)、(800,DCCC)、(900,CM)。其他位也是如此。
由於這裏情況較少,可以直接全部存下來,針對每一位直接表示。當然你也可以把這九種情況分成四類:100~300、400、500~800、900,分別表示,效果相同。
參考代碼
class Solution {
public:
string intToRoman(int num) {
string res = "";
vector<string> v1{"" , "M", "MM", "MMM"};
vector<string> v2{"", "C", "CC", "CCC", "CD", "D", "DC", "DCC", "DCCC", "CM"};
vector<string> v3{"", "X" , "XX", "XXX", "XL", "L", "LX", "LXX", "LXXX", "XC"};
vector<string> v4{"", "I", "II", "III", "IV", "V", "VI", "VII", "VIII", "IX"};
return v1[num/1000] + v2[(num%1000) / 100] + v3[(num%100) / 10] + v4[num%10];
}
};
解法二:貪心
由於限制了輸入數字範圍,有一種利用貪心算法的解法,建立一個對應數組,每次通過查表找出當前可以減去的最大數,將之減去再繼續查表。參考代碼:
class Solution {
public:
string intToRoman(int num) {
string res = "";
vector<int> Number{1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1};
vector<string> Roman{"M", "CM", "D", "CD", "C", "XC", "L", "XL", "X", "IX", "V", "IV", "I"};
for (int i = 0; i < 13; i++) {
while (num >= Number[i]) {
num -= Number[i];
res += Roman[i];
}
}
return res;
}
};
相似問題:LeetCode 13. Roman to Integer
LeetCode All in One題解匯總(持續更新中...)
本文版權歸作者AlvinZH和博客園所有,歡迎轉載和商用,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接,否則保留追究法律責任的權利.
LeetCode 12. Integer to Roman