【刷穿 LeetCode】12. 整數(shù)轉(zhuǎn)羅馬數(shù)字(中等)

點(diǎn)擊 這里 可以查看更多算法面試相關(guān)內(nèi)容~

題目描述

羅馬數(shù)字包含以下七種字符: I凭豪, V阿逃, X, L庄吼,C嚼摩,D 和 M解恰。

字符          數(shù)值
I             1
V             5
X             10
L             50
C             100
D             500
M             1000

例如纳胧, 羅馬數(shù)字 2 寫(xiě)做 II ,即為兩個(gè)并列的 1磺浙。12 寫(xiě)做 XII 洪囤,即為 X + II 。 27 寫(xiě)做 XXVII, 即為 XX + V + II 撕氧。

通常情況下瘤缩,羅馬數(shù)字中小的數(shù)字在大的數(shù)字的右邊。但也存在特例伦泥,例如 4 不寫(xiě)做 IIII剥啤,而是 IV。數(shù)字 1 在數(shù)字 5 的左邊不脯,所表示的數(shù)等于大數(shù) 5 減小數(shù) 1 得到的數(shù)值 4 府怯。同樣地,數(shù)字 9 表示為 IX防楷。這個(gè)特殊的規(guī)則只適用于以下六種情況:

  • I 可以放在 V (5) 和 X (10) 的左邊牺丙,來(lái)表示 4 和 9。
  • X 可以放在 L (50) 和 C (100) 的左邊复局,來(lái)表示 40 和 90冲簿。
  • C 可以放在 D (500) 和 M (1000) 的左邊,來(lái)表示 400 和 900亿昏。

給定一個(gè)整數(shù)峦剔,將其轉(zhuǎn)為羅馬數(shù)字。輸入確保在 1 到 3999 的范圍內(nèi)龙优。

示例 1:

輸入: 3
輸出: "III"

示例 2:

輸入: 4
輸出: "IV"

示例 3:

輸入: 9
輸出: "IX"

示例 4:

輸入: 58
輸出: "LVIII"
解釋: L = 50, V = 5, III = 3.

示例 5:

輸入: 1994
輸出: "MCMXCIV"
解釋: M = 1000, CM = 900, XC = 90, IV = 4.

貪心解法

根據(jù)題意,我們可以列舉出有限個(gè)羅馬字符和其對(duì)應(yīng)的數(shù)值。

然后從左到右構(gòu)建羅馬數(shù)字彤断,優(yōu)先構(gòu)建數(shù)值高的羅馬字符(如果有足夠的分值野舶,盡量嘗試構(gòu)建 "M",直到分值不夠宰衙,再盡量嘗試構(gòu)建 "CM" ... ):

class Solution {
    int[] val = new int[]{1000,900,500,400,100,90,50,40,10,9,5,4,1};
    String[] str = new String[]{"M","CM","D","CD","C","XC","L","XL","X","IX","V","IV","I"};
    public String intToRoman(int x) {
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < val.length && x > 0; i++) {
            int cv = val[i];
            String cs = str[i];
            while (x >= cv) {
                sb.append(cs);
                x -= cv;
            }
        }
        return sb.toString();
    }
}

時(shí)間復(fù)雜度:計(jì)算量與最終羅馬數(shù)字的長(zhǎng)度成正比平道。對(duì)于每一位阿拉伯?dāng)?shù)字,羅馬數(shù)字最多用 4 個(gè)字母表示(比如 VIII = 8)供炼,所以羅馬數(shù)字的長(zhǎng)度最多不超過(guò)阿拉伯?dāng)?shù)字長(zhǎng)度的 4 倍(同一數(shù)量級(jí)內(nèi))一屋。阿拉伯?dāng)?shù)字的長(zhǎng)度約為 logN,因此羅馬數(shù)字的長(zhǎng)度不超過(guò) 4 * logN袋哼。復(fù)雜度為 O(logn)(別忘了復(fù)雜度是忽略常數(shù)的)

空間復(fù)雜度:雖然使用了兩個(gè)數(shù)組記錄羅馬字符和數(shù)值冀墨,但消耗的空間固定,不隨著樣本大小而變化涛贯。復(fù)雜度為 O(1)


最后

這是我們「刷穿 LeetCode」系列文章的第 No.12 篇诽嘉,系列開(kāi)始于 2021/01/01,截止于起始日 LeetCode 上共有 1916 道題目弟翘,部分是有鎖題虫腋,我們將先將所有不帶鎖的題目刷完。

在這個(gè)系列文章里面稀余,除了講解解題思路以外悦冀,還會(huì)盡可能給出最為簡(jiǎn)潔的代碼。如果涉及通解還會(huì)相應(yīng)的代碼模板睛琳。

由于 LeetCode 的題目隨著周賽 & 雙周賽不斷增加盒蟆,為了方便我們統(tǒng)計(jì)進(jìn)度,我們將按照系列起始時(shí)的總題數(shù)作為分母掸掏,完成的題目作為分子茁影,進(jìn)行進(jìn)度計(jì)算。當(dāng)前進(jìn)度為 12/1916 丧凤。

為了方便各位同學(xué)能夠電腦上進(jìn)行調(diào)試和提交代碼募闲,我建立了相關(guān)的倉(cāng)庫(kù):Github 地址 & Gitee 地址

在倉(cāng)庫(kù)地址里愿待,你可以看到系列文章的題解鏈接浩螺、系列文章的相應(yīng)代碼、LeetCode 原題鏈接和一些其他的優(yōu)選題解仍侥。

</br>

算法與數(shù)據(jù)結(jié)構(gòu)

LeetCode題解

算法面試

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末要出,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子农渊,更是在濱河造成了極大的恐慌患蹂,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,406評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異传于,居然都是意外死亡囱挑,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,395評(píng)論 3 398
  • 文/潘曉璐 我一進(jìn)店門(mén)沼溜,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)平挑,“玉大人,你說(shuō)我怎么就攤上這事系草⊥ㄏǎ” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 167,815評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵找都,是天一觀的道長(zhǎng)唇辨。 經(jīng)常有香客問(wèn)我,道長(zhǎng)檐嚣,這世上最難降的妖魔是什么助泽? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,537評(píng)論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮嚎京,結(jié)果婚禮上嗡贺,老公的妹妹穿的比我還像新娘。我一直安慰自己鞍帝,他們只是感情好诫睬,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,536評(píng)論 6 397
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著帕涌,像睡著了一般摄凡。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上蚓曼,一...
    開(kāi)封第一講書(shū)人閱讀 52,184評(píng)論 1 308
  • 那天亲澡,我揣著相機(jī)與錄音,去河邊找鬼纫版。 笑死床绪,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的其弊。 我是一名探鬼主播癞己,決...
    沈念sama閱讀 40,776評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼梭伐!你這毒婦竟也來(lái)了痹雅?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,668評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤糊识,失蹤者是張志新(化名)和其女友劉穎绩社,沒(méi)想到半個(gè)月后摔蓝,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,212評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡愉耙,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,299評(píng)論 3 340
  • 正文 我和宋清朗相戀三年项鬼,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片劲阎。...
    茶點(diǎn)故事閱讀 40,438評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖鸠真,靈堂內(nèi)的尸體忽然破棺而出悯仙,到底是詐尸還是另有隱情,我是刑警寧澤吠卷,帶...
    沈念sama閱讀 36,128評(píng)論 5 349
  • 正文 年R本政府宣布锡垄,位于F島的核電站,受9級(jí)特大地震影響祭隔,放射性物質(zhì)發(fā)生泄漏货岭。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,807評(píng)論 3 333
  • 文/蒙蒙 一疾渴、第九天 我趴在偏房一處隱蔽的房頂上張望千贯。 院中可真熱鬧,春花似錦搞坝、人聲如沸搔谴。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,279評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)敦第。三九已至,卻和暖如春店量,著一層夾襖步出監(jiān)牢的瞬間芜果,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,395評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工融师, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留右钾,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,827評(píng)論 3 376
  • 正文 我出身青樓诬滩,卻偏偏與公主長(zhǎng)得像霹粥,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子疼鸟,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,446評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容