欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C++實(shí)現(xiàn)LeetCode(12.整數(shù)轉(zhuǎn)化成羅馬數(shù)字)

 更新時(shí)間:2021年07月12日 17:03:40   作者:Grandyang  
這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(12.整數(shù)轉(zhuǎn)化成羅馬數(shù)字),本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下

[LeetCode] 12. Integer to Roman 整數(shù)轉(zhuǎn)化成羅馬數(shù)字

Roman numerals are represented by seven different symbols: I, V, X, L, C, D and M.

Symbol       Value
I                   1
V                  5
X                 10
L                  50
C                100
D                 500
M                1000

For example, two is written as II in Roman numeral, just two one's added together. Twelve is written as, XII, which is simply X + II. The number twenty seven is written as XXVII, which is XX + V + II.

Roman numerals are usually written largest to smallest from left to right. However, the numeral for four is not IIII. Instead, the number four is written as IV. Because the one is before the five we subtract it making four. The same principle applies to the number nine, which is written as IX. There are six instances where subtraction is used:

  • I can be placed before V (5) and X (10) to make 4 and 9. 
  • X can be placed before L (50) and C (100) to make 40 and 90. 
  • C can be placed before D (500) and M(1000) to make 400 and 900.

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

Example 1:

Input: 3
Output: "III"

Example 2:

Input: 4
Output: "IV"

Example 3:

Input: 9
Output: "IX"

Example 4:

Input: 58
Output: "LVIII"
Explanation: L = 50, V = 5, III = 3.

Example 5:

Input: 1994
Output: "MCMXCIV"
Explanation: M = 1000, CM = 900, XC = 90 and IV = 4.

之前那篇文章寫的是羅馬數(shù)字轉(zhuǎn)化成整數(shù) Roman to Integer, 這次變成了整數(shù)轉(zhuǎn)化成羅馬數(shù)字,基本算法還是一樣。由于題目中限定了輸入數(shù)字的范圍 (1 - 3999), 使得題目變得簡(jiǎn)單了不少。

I - 1

V - 5

X - 10

L - 50

C - 100 

D - 500

M - 1000

例如整數(shù) 1437 的羅馬數(shù)字為 MCDXXXVII, 我們不難發(fā)現(xiàn),千位,百位,十位和個(gè)位上的數(shù)分別用羅馬數(shù)字表示了。 1000 - M, 400 - CD, 30 - XXX, 7 - VII。所以我們要做的就是用取商法分別提取各個(gè)位上的數(shù)字,然后分別表示出來(lái):

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<char> roman{'M', 'D', 'C', 'L', 'X', 'V', 'I'};
        vector<int> value{1000, 500, 100, 50, 10, 5, 1};
        for (int n = 0; n < 7; n += 2) {
            int x = num / value[n];
            if (x < 4) {
                for (int i = 1; i <= x; ++i) res += roman[n];
            } else if (x == 4) {
                res = res + roman[n] + roman[n - 1]; 
            } else if (x > 4 && x < 9) {
                res += roman[n - 1];
                for (int i = 6; i <= x; ++i) res += roman[n];
            } else if (x == 9) {
                res = res + roman[n] + roman[n - 2];
            }
            num %= value[n];            
        }
        return res;
    }
};

本題由于限制了輸入數(shù)字范圍這一特殊性,故而還有一種利用貪婪算法的解法,建立一個(gè)數(shù)表,每次通過(guò)查表找出當(dāng)前最大的數(shù),減去再繼續(xù)查表,參見代碼如下:

解法二:

class Solution {
public:
    string intToRoman(int num) {
        string res = "";
        vector<int> val{1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1};
        vector<string> str{"M", "CM", "D", "CD", "C", "XC", "L", "XL", "X", "IX", "V", "IV", "I"};
        for (int i = 0; i < val.size(); ++i) {
            while (num >= val[i]) {
                num -= val[i];
                res += str[i];
            }
        }
        return res;
    }
};

下面這種方法個(gè)人感覺屬于比較投機(jī)取巧的方法,把所有的情況都列了出來(lái),然后直接按位查表,O(1) 的時(shí)間復(fù)雜度啊,參見代碼如下:

解法三:

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];
    }
};

到此這篇關(guān)于C++實(shí)現(xiàn)LeetCode(12.整數(shù)轉(zhuǎn)化成羅馬數(shù)字)的文章就介紹到這了,更多相關(guān)C++實(shí)現(xiàn)整數(shù)轉(zhuǎn)化成羅馬數(shù)字內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C語(yǔ)言實(shí)現(xiàn)三子棋小游戲(vs2013多文件)

    C語(yǔ)言實(shí)現(xiàn)三子棋小游戲(vs2013多文件)

    這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)三子棋小游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-06-06
  • C/C++靜態(tài)類和this指針詳解及實(shí)例代碼

    C/C++靜態(tài)類和this指針詳解及實(shí)例代碼

    這篇文章主要介紹了 C/C++靜態(tài)類和this指針詳解及實(shí)例代碼的相關(guān)資料,需要的朋友可以參考下
    2017-02-02
  • 示例詳解C++語(yǔ)言中的命名空間 (namespace)

    示例詳解C++語(yǔ)言中的命名空間 (namespace)

    C++名字空間是一種描述邏輯分組的機(jī)制,也就是說(shuō),如果有一些聲明按照某種準(zhǔn)則在邏輯上屬于同一個(gè)模塊,就可以將它們放在同一個(gè)名字空間,以表明這個(gè)事實(shí),這篇文章主要給大家介紹了關(guān)于C++語(yǔ)言中命名空間 (namespace)的相關(guān)資料,需要的朋友可以參考下
    2021-08-08
  • C語(yǔ)言中sscanf()函數(shù)的字符串格式化用法

    C語(yǔ)言中sscanf()函數(shù)的字符串格式化用法

    這篇文章介紹的是C語(yǔ)言中sscanf()函數(shù),本文介紹了sscanf()函數(shù)的含義與用法,對(duì)大家日常使用C語(yǔ)言的sscanf()函數(shù)很有幫助,有需要的可以參考借鑒。
    2016-08-08
  • C語(yǔ)言鏈表完整操作演示

    C語(yǔ)言鏈表完整操作演示

    這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言鏈表的完整操作演示,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-05-05
  • C語(yǔ)言刷題判斷鏈表中是否有環(huán)題解

    C語(yǔ)言刷題判斷鏈表中是否有環(huán)題解

    這篇文章主要為大家介紹了C語(yǔ)言刷題判斷鏈表中是否有環(huán)題解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-07-07
  • C語(yǔ)言關(guān)鍵字大全(共32個(gè))

    C語(yǔ)言關(guān)鍵字大全(共32個(gè))

    這篇文章主要分享下C語(yǔ)言的32個(gè)關(guān)鍵字,需要的朋友可以參考下
    2013-07-07
  • C++程序中使用Windows系統(tǒng)Native Wifi API的基本教程

    C++程序中使用Windows系統(tǒng)Native Wifi API的基本教程

    這篇文章主要介紹了C++程序中使用Windows系統(tǒng)Native Wifi API的基本教程,包括在程序中控制無(wú)線網(wǎng)卡開關(guān)的方法,需要的朋友可以參考下
    2016-03-03
  • C++11 并發(fā)指南之std::thread 詳解

    C++11 并發(fā)指南之std::thread 詳解

    這篇文章主要介紹了C++11 并發(fā)指南之std::thread 詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-02-02
  • 詳解C++中的對(duì)象指針與對(duì)象數(shù)組

    詳解C++中的對(duì)象指針與對(duì)象數(shù)組

    這篇文章主要介紹了詳解C++中的對(duì)象指針與對(duì)象數(shù)組,是C++入門學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下
    2015-09-09

最新評(píng)論