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

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

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

[LeetCode] 13. Roman to Integer 羅馬數(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 a roman numeral, convert it to an integer. Input is guaranteed to be within the range from 1 to 3999.

Example 1:

Input: "III"
Output: 3

Example 2:

Input: "IV"
Output: 4

Example 3:

Input: "IX"
Output: 9

Example 4:

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

Example 5:

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


羅馬數(shù)轉(zhuǎn)化成數(shù)字問題,我們需要對(duì)于羅馬數(shù)字很熟悉才能完成轉(zhuǎn)換。以下截自百度百科:

羅馬數(shù)字是最早的數(shù)字表示方式,比阿拉伯?dāng)?shù)字早2000多年,起源于羅馬。
如今我們最常見的羅馬數(shù)字就是鐘表的表盤符號(hào):Ⅰ,Ⅱ,Ⅲ,Ⅳ(IIII),Ⅴ,Ⅵ,Ⅶ,Ⅷ,Ⅸ,Ⅹ,Ⅺ,Ⅻ……
對(duì)應(yīng)阿拉伯?dāng)?shù)字(就是現(xiàn)在國際通用的數(shù)字),就是1,2,3,4,5,6,7,8,9,10,11,12。(注:阿拉伯?dāng)?shù)字其實(shí)是古代印度人發(fā)明的,后來由阿拉伯人傳入歐洲,被歐洲人誤稱為阿拉伯?dāng)?shù)字。)

I - 1

V - 5

X - 10

L - 50

C - 100 

D - 500

M - 1000

1、相同的數(shù)字連寫,所表示的數(shù)等于這些數(shù)字相加得到的數(shù),如:Ⅲ = 3;
2、小的數(shù)字在大的數(shù)字的右邊,所表示的數(shù)等于這些數(shù)字相加得到的數(shù), 如:Ⅷ = 8;Ⅻ = 12;
3、小的數(shù)字,(限于Ⅰ、X 和C)在大的數(shù)字的左邊,所表示的數(shù)等于大數(shù)減小數(shù)得到的數(shù),如:Ⅳ= 4;Ⅸ= 9;
4、正常使用時(shí),連寫的數(shù)字重復(fù)不得超過三次。(表盤上的四點(diǎn)鐘“IIII”例外)
5、在一個(gè)數(shù)的上面畫一條橫線,表示這個(gè)數(shù)擴(kuò)大1000倍。
有幾條須注意掌握:
1、基本數(shù)字Ⅰ、X 、C 中的任何一個(gè),自身連用構(gòu)成數(shù)目,或者放在大數(shù)的右邊連用構(gòu)成數(shù)目,都不能超過三個(gè);放在大數(shù)的左邊只能用一個(gè)。
2、不能把基本數(shù)字V 、L 、D 中的任何一個(gè)作為小數(shù)放在大數(shù)的左邊采用相減的方法構(gòu)成數(shù)目;放在大數(shù)的右邊采用相加的方式構(gòu)成數(shù)目,只能使用一個(gè)。
3、V 和X 左邊的小數(shù)字只能用Ⅰ。
4、L 和C 左邊的小數(shù)字只能用X。
5、D 和M 左邊的小數(shù)字只能用C。
而這道題好就好在沒有讓我們來驗(yàn)證輸入字符串是不是羅馬數(shù)字,這樣省掉不少功夫。需要用到 HashMap 數(shù)據(jù)結(jié)構(gòu),來將羅馬數(shù)字的字母轉(zhuǎn)化為對(duì)應(yīng)的整數(shù)值,因?yàn)檩斎氲囊欢ㄊ橇_馬數(shù)字,那么只要考慮兩種情況即可:
第一,如果當(dāng)前數(shù)字是最后一個(gè)數(shù)字,或者之后的數(shù)字比它小的話,則加上當(dāng)前數(shù)字。
第二,其他情況則減去這個(gè)數(shù)字。
解法一:
class Solution {
public:
    int romanToInt(string s) {
        int res = 0;
        unordered_map<char, int> m{{'I', 1}, {'V', 5}, {'X', 10}, {'L', 50}, {'C', 100}, {'D', 500}, {'M', 1000}};
        for (int i = 0; i < s.size(); ++i) {
            int val = m[s[i]];
            if (i == s.size() - 1 || m[s[i+1]] <= m[s[i]]) res += val;
            else res -= val;
        }
        return res;
    }
};

我們也可以每次跟前面的數(shù)字比較,如果小于等于前面的數(shù)字,先加上當(dāng)前的數(shù)字,比如 "VI",第二個(gè)字母 'I' 小于第一個(gè)字母 'V',所以要加1。如果大于的前面的數(shù)字,加上當(dāng)前的數(shù)字減去二倍前面的數(shù)字,這樣可以把在上一個(gè)循環(huán)多加數(shù)減掉,比如 "IX",我們?cè)?i=0 時(shí),加上了第一個(gè)字母 'I' 的值,此時(shí)結(jié)果 res 為1。當(dāng) i=1 時(shí),字母 'X' 大于前一個(gè)字母 'I',這說明前面的1是要減去的,而由于前一步不但沒減,還多加了個(gè)1,所以此時(shí)要減去2倍的1,就是減2,所以才能得到9,整個(gè)過程是 res = 1 + 10 - 2 = 9,參見代碼如下:

解法二:

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

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

相關(guān)文章

  • 用C語言實(shí)現(xiàn)簡單的三子棋

    用C語言實(shí)現(xiàn)簡單的三子棋

    這篇文章主要為大家詳細(xì)介紹了用C語言實(shí)現(xiàn)三子棋,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-06-06
  • C語言中QString與QByteArray互相轉(zhuǎn)換的方法

    C語言中QString與QByteArray互相轉(zhuǎn)換的方法

    本文主要介紹了C語言中QString與QByteArray互相轉(zhuǎn)換的方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-05-05
  • c語言中用字符串?dāng)?shù)組顯示菜單的解決方法

    c語言中用字符串?dāng)?shù)組顯示菜單的解決方法

    本篇文章是對(duì)c語言中用字符串?dāng)?shù)組顯示菜單的方法進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-05-05
  • Qt編程實(shí)現(xiàn)小時(shí)鐘

    Qt編程實(shí)現(xiàn)小時(shí)鐘

    這篇文章主要為大家詳細(xì)介紹了Qt編程實(shí)現(xiàn)小時(shí)鐘,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-05-05
  • 深入理解C++的對(duì)象模型

    深入理解C++的對(duì)象模型

    本文在介紹C++使用的對(duì)象模型之前,先介紹了2種對(duì)象模型:簡單對(duì)象模型(a simple object model)和表格驅(qū)動(dòng)對(duì)象模型(a table-driven object model),這樣介紹對(duì)后面的內(nèi)容更有幫助,有需要的小伙伴們可以參考學(xué)習(xí)。
    2016-08-08
  • 使用OpenCV實(shí)現(xiàn)檢測(cè)和追蹤車輛

    使用OpenCV實(shí)現(xiàn)檢測(cè)和追蹤車輛

    這篇文章主要為大家詳細(xì)介紹了使用OpenCV實(shí)現(xiàn)檢測(cè)和追蹤車輛,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-01-01
  • C語言對(duì)磁盤文件進(jìn)行快速排序簡單實(shí)例

    C語言對(duì)磁盤文件進(jìn)行快速排序簡單實(shí)例

    這篇文章主要介紹了C語言對(duì)磁盤文件進(jìn)行快速排序簡單實(shí)例的相關(guān)資料,需要的朋友可以參考下
    2017-06-06
  • 使用C語言調(diào)用luajit的方法詳解

    使用C語言調(diào)用luajit的方法詳解

    C語言是一種非常流行的編程語言,而Lua是一種基于C語言開發(fā)的腳本語言,在Lua的各種實(shí)現(xiàn)中,luajit也是其中一種非常流行的實(shí)現(xiàn),在本文中,我將為大家介紹如何使用C語言調(diào)用luajit,并且詳細(xì)介紹如何傳入?yún)?shù),傳入結(jié)構(gòu)體參數(shù),以及獲取返回值
    2023-11-11
  • C++面試八股文之什么是構(gòu)造函數(shù)

    C++面試八股文之什么是構(gòu)造函數(shù)

    構(gòu)造函數(shù)是一種特殊的成員函數(shù),用于創(chuàng)建和初始化類的對(duì)象,這篇文章主要為大家詳細(xì)介紹了C++中構(gòu)造函數(shù)的相關(guān)知識(shí)點(diǎn),需要的可以參考一下
    2023-06-06
  • C語言實(shí)現(xiàn)手寫紅黑樹的示例代碼

    C語言實(shí)現(xiàn)手寫紅黑樹的示例代碼

    紅黑樹在表意上就是一棵每個(gè)節(jié)點(diǎn)帶有顏色的二叉搜索樹,并通過對(duì)節(jié)點(diǎn)顏色的控制,使該二叉搜索樹達(dá)到盡量平衡的狀態(tài)。本文主將用C語言實(shí)現(xiàn)手寫紅黑樹,需要的可以參考一下
    2022-09-09

最新評(píng)論

天等县| 广平县| 德惠市| 乌兰浩特市| 阿克| 锦屏县| 宽甸| 互助| 连城县| 金塔县| 海南省| 平山县| 临夏县| 鲜城| 樟树市| 隆昌县| 连南| 中阳县| 逊克县| 开化县| 潼南县| 中卫市| 东城区| 离岛区| 云和县| 麻城市| 邵阳市| 临清市| 吉安市| 徐汇区| 泗洪县| 汪清县| 新晃| 汉阴县| 平果县| 桃源县| 松阳县| 北票市| 内丘县| 麦盖提县| 乐亭县|