1. 程式人生 > >LeetCode 12. Integer to Roman

LeetCode 12. Integer to Roman

大數 所有 轉換成 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