LeetCode:Roman to Integer,Integer to Roman

首先簡單介紹一下羅馬數字,一下摘自維基百科html

羅馬數字共有7個,即I(1)、V(5)、X(10)、L(50)、C(100)、D(500)和M(1000)。按照下述的規則能夠表示任意正整數。須要注意的是羅馬數字中沒有「0」,與進位制無關。通常認爲羅馬數字只用來記數,而不做演算。app

  • 重複數次:一個羅馬數字重複幾回,就表示這個數的幾倍。
  • 右加左減:
    • 在較大的羅馬數字的右邊記上較小的羅馬數字,表示大數字加小數字。
    • 在較大的羅馬數字的左邊記上較小的羅馬數字,表示大數字減少數字。
    • 左減的數字有限制,僅限於I、X、C。好比45不能夠寫成VL,只能是XLV
    • 可是,左減時不可跨越一個位數。好比,99不能夠用IC(100 - 1)表示,而是用XCIX([100 - 10] + [10 - 1])表示。(等同於阿拉伯數字每位數字分別表示。)
    • 左減數字必須爲一位,好比8寫成VIII,而非IIX。
    • 右加數字不可連續超過三位,好比14寫成XIV,而非XIIII。(見下方「數碼限制」一項。)
  • 加線乘千:
    • 在羅馬數字的上方加上一條橫線或者加上下標的Ⅿ,表示將這個數乘以1000,便是原數的1000倍。
    • 同理,若是上方有兩條橫線,便是原數的1000000(1000^{2})倍。
  • 數碼限制:
    • 同一數碼最多隻能出現三次,如40不可表示爲XXXX,而要表示爲XL。
    • 例外:因爲IV是古羅馬神話主神朱庇特(即IVPITER,古羅馬字母裏沒有J和U)的首字,所以有時用IIII代替IV。

Roman to Integer

Given a roman numeral, convert it to an integer.code

Input is guaranteed to be within the range from 1 to 3999.htm

 

 

3999範圍內的羅馬數字不會用到加上劃線的字母blog

從最後一個字符開始,若是當前字符對應的數字比上一個數字小,那麼就把結果減去當前字符對應的數字,不然加上當前字符對應數字。爲了處理邊界狀況,在原字符串最後添加一個字符,該字符是原來的尾字符。ip

class Solution {
public:
    int romanToInt(string s) {
        int map[26];
        map['I'-'A'] = 1; map['V'-'A'] = 5; map['X'-'A'] = 10; map['L'-'A'] = 50; 
        map['C'-'A'] = 100; map['D'-'A'] = 500; map['M'-'A'] = 1000;
        int res = 0, n = s.size();
        s.push_back(s[n-1]);
        for(int i = 0; i < n; i++)
        {
            if(map[s[i]-'A'] >= map[s[i+1]-'A'])
                res += map[s[i]-'A'];
            else res -= map[s[i]-'A'];
        }
        return res;
    }
};

 


Integer to Romanleetcode

Given an integer, convert it to a roman numeral.字符串

Input is guaranteed to be within the range from 1 to 3999get

咱們注意到羅馬數字的字母是有規律的,能夠分紅幾組,I(1), V(5) 是一組, X(10), L(50)是一組, C(100), D(500)是一組, M(1000), d(應該是D加一個上劃線,表示5000) 是一組 ……。後一組的兩個數是前一組的10倍。string

對於大於10的整數,咱們把該整數逐位表示成羅馬數字。                                    本文地址

個位上的數字1~9的分別爲: I II III IV V VI VII VIII IX

十位上的數字1~9,只要把原來個位上的I 替換成 X, V 替換成L,X替換成C,即十位上的1~9表示的是10~90.

百位、千位以此類推。。。。。。

class Solution {
public:
    string intToRoman(int num) {
        char romanChar[] = {'I','V','X','L','C','D','M'};
        string res;
        int i = 6, factor = 1000;
        while(num != 0)
        {
            helper(num / factor, &romanChar[i], res);
            i -= 2;
            num %= factor;
            factor /= 10;
        }
        return res;
    }
    
    void helper(int k, char romanChar[], string &res)
    {// 0 <= k <= 9
        if(k <= 0);
        else if(k <= 3)
            res.append(k, romanChar[0]);
        else if(k == 4)
        {
            res.push_back(romanChar[0]);
            res.push_back(romanChar[1]);
        }
        else if(k <= 8)
        {
            res.push_back(romanChar[1]);
            res.append(k-5, romanChar[0]);
        }
        else if(k == 9)
        {
            res.push_back(romanChar[0]);
            res.push_back(romanChar[2]);
        }
    }
};

 

【版權聲明】轉載請註明出處:http://www.cnblogs.com/TenosDoIt/p/3793503.html

相關文章
相關標籤/搜索