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

【題目描述】
羅馬數(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 寫做 II 寻定,即為兩個并列的 1。12 寫做 XII 精耐,即為 X + II 狼速。 27 寫做 XXVII, 即為 XX + V + II 。

通常情況下卦停,羅馬數(shù)字中小的數(shù)字在大的數(shù)字的右邊向胡。但也存在特例恼蓬,例如 4 不寫做 IIII,而是 IV僵芹。數(shù)字 1 在數(shù)字 5 的左邊处硬,所表示的數(shù)等于大數(shù) 5 減小數(shù) 1 得到的數(shù)值 4 。同樣地淮捆,數(shù)字 9 表示為 IX郁油。這個特殊的規(guī)則只適用于以下六種情況:

I 可以放在 V (5) 和 X (10) 的左邊,來表示 4 和 9攀痊。
X 可以放在 L (50) 和 C (100) 的左邊桐腌,來表示 40 和 90。
C 可以放在 D (500) 和 M (1000) 的左邊苟径,來表示 400 和 900案站。

給定一個整數(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.

【思路1】
1、取余法
2遭殉、每次取余 得到一個數(shù)字 判斷為哪一位:

  • 個位 十位 百位 千位
  • 判斷 num<=3
  • num == 4
  • num == 5
  • 6<=num>9
  • num == 9
    3石挂、根據(jù)判斷添加字符串
    4、時間復(fù)雜度O(1)
    5险污、空間復(fù)雜度O(n)
    6痹愚、代碼比較繁瑣
    Swift 代碼實現(xiàn):
func intToRoman(_ num: Int) -> String {
    var res = [String]()
    var tmpNum = num
    var location = 0//位
    while tmpNum > 0 {
        let value = tmpNum%10
        if value <= 3 {
            var t = value
            var tStr = String.init()
            while t > 0 {
                if location == 0 {
                    tStr.append("I")
                } else if location == 1 {
                    tStr.append("X")
                } else if location == 2 {
                    tStr.append("C")
                } else {
                    tStr.append("M")
                }
                t-=1
            }
            res.append(tStr)
        } else if value == 4 {
            if location == 0 {
                res.append("IV")
            } else if location == 1 {
                res.append("XL")
            } else if location == 2 {
                res.append("CD")
            }
        } else if value == 5 {
            if location == 0 {
                res.append("V")
            } else if location == 1 {
                res.append("L")
            } else if location == 2 {
                res.append("D")
            }
        } else if value > 5 && value <= 8 {
            var t = value
            var tStr = String()
            if location == 0 {
                tStr.append("V")
            } else if location == 1 {
                tStr.append("L")
            } else if location == 2 {
                tStr.append("D")
            }
            t-=5
            while t > 0 {
                if location == 0 {
                    tStr.append("I")
                } else if location == 1 {
                  tStr.append("X")
                } else if location == 2 {
                    tStr.append("C")
                }
                t-=1
            }
            res.append(tStr)
        } else {
            if location == 0 {
                res.append("IX")
            } else if location == 1 {
                res.append("XC")
            } else if location == 2 {
                res.append("CM")
            }
        }
        tmpNum/=10
        location+=1
    }
    
    var str = String()
    while location > 0 {
        str.append(res[location-1])
        location-=1
    }
    return str
}

【思路2】
1、使用兩個數(shù)組分別把羅馬字母(包含特殊字母蛔糯,兩位的) 和 數(shù)字一一對應(yīng)起來, value為數(shù)字?jǐn)?shù)組拯腮,letter為字符數(shù)組
2、循環(huán)條件為 num > 0 && i < value.count蚁飒,i為兩個數(shù)組的index
3动壤、每次循環(huán) 判斷剩余的數(shù)是否大于value[i]
4、如果大于淮逻,str.append(letter[i])
5琼懊、如果小于 i++即可
6、最后返回str
7爬早、時間復(fù)雜度O(1)
8哼丈、空間復(fù)雜度O(1)

Swift代碼實現(xiàn):

func intToRoman(_ num: Int) -> String {
    let value = [1000,900,500,400,100,90,50,40,10,9,5,4,1]
    let letter = ["M","CM","D","CD","C","XC","L","XL","X","IX","V","IV","I"]
    var res = String()
    var i = 0
    var tmpNum = num
    while tmpNum > 0 && i < letter.count {
        if tmpNum >= value[i] {
            res.append(letter[i])
            tmpNum-=value[i]
        } else {
            i+=1
        }
    }
    return res
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市凸椿,隨后出現(xiàn)的幾起案子削祈,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,820評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件髓抑,死亡現(xiàn)場離奇詭異咙崎,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)吨拍,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,648評論 3 399
  • 文/潘曉璐 我一進(jìn)店門褪猛,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人羹饰,你說我怎么就攤上這事伊滋。” “怎么了队秩?”我有些...
    開封第一講書人閱讀 168,324評論 0 360
  • 文/不壞的土叔 我叫張陵笑旺,是天一觀的道長。 經(jīng)常有香客問我馍资,道長筒主,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,714評論 1 297
  • 正文 為了忘掉前任鸟蟹,我火速辦了婚禮乌妙,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘建钥。我一直安慰自己藤韵,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,724評論 6 397
  • 文/花漫 我一把揭開白布熊经。 她就那樣靜靜地躺著泽艘,像睡著了一般。 火紅的嫁衣襯著肌膚如雪奈搜。 梳的紋絲不亂的頭發(fā)上悉盆,一...
    開封第一講書人閱讀 52,328評論 1 310
  • 那天盯荤,我揣著相機(jī)與錄音馋吗,去河邊找鬼。 笑死秋秤,一個胖子當(dāng)著我的面吹牛宏粤,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播灼卢,決...
    沈念sama閱讀 40,897評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼绍哎,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了鞋真?” 一聲冷哼從身側(cè)響起崇堰,我...
    開封第一講書人閱讀 39,804評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后海诲,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體繁莹,經(jīng)...
    沈念sama閱讀 46,345評論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,431評論 3 340
  • 正文 我和宋清朗相戀三年特幔,在試婚紗的時候發(fā)現(xiàn)自己被綠了咨演。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,561評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡蚯斯,死狀恐怖薄风,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情拍嵌,我是刑警寧澤遭赂,帶...
    沈念sama閱讀 36,238評論 5 350
  • 正文 年R本政府宣布,位于F島的核電站横辆,受9級特大地震影響嵌牺,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜龄糊,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,928評論 3 334
  • 文/蒙蒙 一逆粹、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧炫惩,春花似錦僻弹、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,417評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至筋蓖,卻和暖如春卸耘,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背粘咖。 一陣腳步聲響...
    開封第一講書人閱讀 33,528評論 1 272
  • 我被黑心中介騙來泰國打工蚣抗, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人瓮下。 一個月前我還...
    沈念sama閱讀 48,983評論 3 376
  • 正文 我出身青樓翰铡,卻偏偏與公主長得像,于是被迫代替她去往敵國和親讽坏。 傳聞我的和親對象是個殘疾皇子锭魔,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,573評論 2 359

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