最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

[LeetCode] 12. Integer to Roman 整數(shù)轉化成羅馬數(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ù)字轉化成整數(shù) Roman to Integer, 這次變成了整數(shù)轉化成羅馬數(shù)字,基本算法還是一樣。由于題目中限定了輸入數(shù)字的范圍 (1 - 3999), 使得題目變得簡單了不少。

I - 1

V - 5

X - 10

L - 50

C - 100 

D - 500

M - 1000

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

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ù)字范圍這一特殊性,故而還有一種利用貪婪算法的解法,建立一個數(shù)表,每次通過查表找出當前最大的數(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;
    }
};

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

解法三:

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

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

相關文章

  • C語言創(chuàng)建和操作單鏈表數(shù)據(jù)結構的實例教程

    C語言創(chuàng)建和操作單鏈表數(shù)據(jù)結構的實例教程

    這篇文章主要介紹了C語言創(chuàng)建和操作單鏈表數(shù)據(jù)結構的實例教程,講解使用C語言實現(xiàn)鏈表結構時指針的使用,需要的朋友可以參考下
    2016-04-04
  • 利用Matlab繪制一個可愛的南瓜燈

    利用Matlab繪制一個可愛的南瓜燈

    這篇文章主要為大家介紹了如何利用Matlab繪制一個可愛的南瓜燈!文中的示例代碼講解詳細,對我們學習Matlab有一定幫助,需要的可以參考一下
    2022-02-02
  • c++ 入門——淺析構造函數(shù)和析構函數(shù)

    c++ 入門——淺析構造函數(shù)和析構函數(shù)

    這篇文章主要介紹了c++ 淺析構造函數(shù)和析構函數(shù)的相關資料,幫助大家入門c++ 編程,感興趣的朋友可以了解下
    2020-08-08
  • 詳解C++中new運算符和delete運算符的使用

    詳解C++中new運算符和delete運算符的使用

    這篇文章主要介紹了C++中new運算符和delete運算符的使用,文章來自于微軟開發(fā)者文檔,因而根據(jù)Visual C++的一些特性來進行講解,需要的朋友可以參考下
    2016-01-01
  • C語言函數(shù)棧幀的創(chuàng)建與銷毀詳解

    C語言函數(shù)棧幀的創(chuàng)建與銷毀詳解

    函數(shù)棧幀(stack frame)就是函數(shù)調用過程中在程序的調用棧(call stack)所開辟的空間,下面這篇文章主要給大家介紹了關于C語言函數(shù)棧幀的創(chuàng)建與銷毀的相關資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2022-09-09
  • Microsoft Visual C++ 程序的部署方法

    Microsoft Visual C++ 程序的部署方法

    由Microsoft Visual C++編譯的程序動態(tài)鏈接到C運行時(/MD 或 /MDd),它必須運行DLL的一份拷貝(通常被叫作MSVCRT.DLL 或 MSVCRxx.DLL,其中xx代表Visual C++的版本)
    2013-04-04
  • C語言制作表白神器的示例代碼

    C語言制作表白神器的示例代碼

    這篇文章主要為大家詳細介紹了如何利用C語言制作一個簡單的表白神器,文中的示例代碼講解詳細,具有一定的借鑒價值,感興趣的小伙伴可以了解一下
    2023-03-03
  • 運用指針在不用加號的情況進行加法運算的講解

    運用指針在不用加號的情況進行加法運算的講解

    今天小編就為大家分享一篇關于運用指針在不用加號的情況進行加法運算的講解,小編覺得內容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2019-01-01
  • 詳解C++中二進制求補運算符與下標運算符的用法

    詳解C++中二進制求補運算符與下標運算符的用法

    這篇文章主要介紹了C++中二進制求補運算符與下標運算符的用法,是C++入門學習中的基礎知識,需要的朋友可以參考下
    2016-01-01
  • C語言實現(xiàn)五子棋游戲

    C語言實現(xiàn)五子棋游戲

    這篇文章主要為大家詳細介紹了C語言五子棋游戲,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-02-02

最新評論

乌鲁木齐市| 天津市| 仙游县| 岑溪市| 丹寨县| 阳高县| 独山县| 西峡县| 东台市| 云林县| 遂溪县| 云阳县| 噶尔县| 建瓯市| 女性| 渭源县| 凤凰县| 阿拉善盟| 秀山| 三门县| 会泽县| 灌阳县| 乌兰察布市| 搜索| 武夷山市| 旅游| 黄陵县| 河东区| 富民县| 新泰市| 马鞍山市| 安多县| 长岛县| 原阳县| 沅江市| 汕头市| 昌平区| 商洛市| 天等县| 仙居县| 怀化市|