leetcode (12) - INT TO ROMAN

Given an integer, convert it to a roman numeral.
Input is guaranteed to be within the range from 1 to 3999.

思路
首先,學習一下羅馬數字,參考羅馬數字
羅馬數字是最古老的數字表示方式,比阿拉伯數組早2000多年,起源於羅馬
羅馬數字有如下符號:
基本字符 I V X L C D M
對應阿拉伯數字 1 5 10 50 100 500 1000

計數規則: 相同的數字連寫,所表示的數等於這些數字相加得到的數,例如:III = 3
小的數字在大的數字右邊,所表示的數等於這些數字相加得到的數,例如:VIII = 8小的數字,
限於(I、X和C)在大的數字左邊,所表示的數等於大數減去小數所得的數,例如:IV = 4正常使用時,連續的數字重複不得超過三次在一個數的上面畫橫線,表示這個數擴大1000倍(本題只考慮3999以內的數,所以用不到這條規則)
其次,羅馬數字轉阿拉伯數字規則(僅限於3999以內):
從前向後遍歷羅馬數字,如果某個數比前一個數小,則加上該數。反之,減去前一個數的兩倍然後加上該數




思路1:構造法,每一位構造然後拼接。每一位表示的字母雖然不同,但是規則是一樣的,所以考慮每一位上0-9的表現形式,然後拼接起來。(詳見參考1)
思路2:採用貪心策略,每次選擇能表示的最大的值,把對應的字符串連接起來,代碼及其簡潔。
class Solution {
public:
    string intToRoman(int num) {
        string str = "";    
        string symbol[] = {"M","CM","D","CD","C","XC","L","XL","X","IX","V","IV","I"};    
        int value[] = {1000,900,500,400, 100, 90,  50, 40,  10, 9,   5,  4,   1};   
        for(int i=0;num!=0;i++){  
            while(num >= value[i]){  
                num -= value[i];  
                str += symbol[i];  
            }  
        }  
        return str;  


    }
};



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章