C#算法之羅馬數(shù)字轉(zhuǎn)整數(shù)
羅馬數(shù)字轉(zhuǎn)整數(shù)
羅馬數(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
,即為兩個(gè)并列的 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
。這個(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:
輸入:?"III" 輸出: 3
示例 2:
輸入:?"IV" 輸出: 4
示例 3:
輸入:?"IX" 輸出: 9
示例 4:
輸入:?"LVIII" 輸出: 58 解釋: L = 50, V= 5, III = 3.
示例 5:
輸入:?"MCMXCIV" 輸出: 1994 解釋: M = 1000, CM = 900, XC = 90, IV = 4.
筆者的方法:
時(shí)間200ms左右,
思路是
- 把所有的情況放到哈希表中
- 每次取一個(gè)位
- 把 i 和 i+1 放一起,試試有沒有區(qū)配的,有的話把 i 和 i+1 放一起
- 沒有的話,就是 只是計(jì) i
public class Solution { public int RomanToInt(string s) { char[] c = s.ToCharArray(); //將其轉(zhuǎn)為字符數(shù)組 int sum = 0; //值 Hashtable hashtable = new Hashtable(); //7個(gè)基本單位 hashtable.Add("I", 1); hashtable.Add("V", 5); hashtable.Add("X", 10); hashtable.Add("L", 50); hashtable.Add("C", 100); hashtable.Add("D", 500); hashtable.Add("M", 1000); //加上6種情況 hashtable.Add("IV", 4); hashtable.Add("IX", 9); hashtable.Add("XL", 40); hashtable.Add("XC", 90); hashtable.Add("CD", 400); hashtable.Add("CM", 900);
/*
* 六種情況
IV 4 IX 9
XL 40 XC 90
CD 400 CM 9000
*/
for (int i = 0; i < c.Length; i++) { if (i + 1 < c.Length && hashtable.ContainsKey(c[i].ToString() + c[i + 1].ToString())) //如果發(fā)現(xiàn)兩位一起能區(qū)配的話 { sum += int.Parse(hashtable[c[i].ToString() + c[i + 1].ToString()].ToString()); //獲取值,HashTable的類型都是Object! i++; //跳兩位 } else { sum += int.Parse(hashtable[c[i].ToString()].ToString()); } } return sum; } }
換成字典
public class Solution { public int RomanToInt(string s) { char[] c = s.ToCharArray(); //將其轉(zhuǎn)為字符數(shù)組 int sum = 0; //值 Dictionary<string, int> dictionary = new Dictionary<string, int>(); //7個(gè)基本單位 dictionary.Add("I", 1); dictionary.Add("V", 5); dictionary.Add("X", 10); dictionary.Add("L", 50); dictionary.Add("C", 100); dictionary.Add("D", 500); dictionary.Add("M", 1000); //加上6種情況 dictionary.Add("IV", 4); dictionary.Add("IX", 9); dictionary.Add("XL", 40); dictionary.Add("XC", 90); dictionary.Add("CD", 400); dictionary.Add("CM", 900);
/*
* 六種情況
IV 4 IX 9
XL 40 XC 90
CD 400 CM 9000
*/
for (int i = 0; i < c.Length; i++) { if (i + 1 < c.Length && dictionary.ContainsKey(c[i].ToString() + c[i + 1])) //如果發(fā)現(xiàn)兩位一起能區(qū)配的話 { sum += dictionary[c[i].ToString() + c[i + 1].ToString()]; //獲取值,HashTable的類型都是Object! i++; //跳兩位 } else { sum += dictionary[c[i].ToString()]; } } return sum; } }
以上兩個(gè)例子都會(huì)進(jìn)行較多的裝箱拆箱,下面主要使用if-else,switch,空間花銷較大,但是如果測(cè)試?yán)虞^多,進(jìn)行大量計(jì)算,時(shí)間會(huì)相對(duì)少一點(diǎn)。
public class Solution { public int RomanToInt(string s) { int sum = 0; //值 for (int i = 0; i < s.Length; i++) { if (i + 1 < s.Length) //如果后面還有別的字符 { if (s[i] == 'I') { int a = 0; switch (s[i + 1]) //"i%" { case 'V': a = 4; i++; break; case 'X': a = 9; i++; break; default: a = 1; break; } sum += a; } else if (s[i] == 'X') { int a = 0; switch (s[i + 1]) //"X%" { case 'L': a = 40; i++; break; case 'C': a = 90; i++; break; default: a = 10; break; } sum += a; } else if (s[i] == 'C') { int a = 0; switch (s[i + 1]) //"X%" { case 'D': a = 400; i++; break; case 'M': a = 900; i++; break; default: a = 100; break; } sum += a; } else { int a = 0; switch (s[i]) {case 'V': a = 5; break;case 'L': a = 50; break;case 'D': a = 500; break; case 'M': a = 1000; break; } sum += a; } } else { int a = 0; switch (s[i]) { case 'I': a = 1; break; case 'V': a = 5; break; case 'X': a = 10; break; case 'L': a = 50; break; case 'C': a = 100; break; case 'D': a = 500; break; case 'M': a = 1000; break; } sum += a; } } return sum; } }
到此這篇關(guān)于C#算法之羅馬數(shù)字轉(zhuǎn)整數(shù)的文章就介紹到這了。希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
使用C# Winform應(yīng)用程序獲取網(wǎng)頁(yè)源文件的解決方法
本篇文章是對(duì)使用C# Winform應(yīng)用程序獲取網(wǎng)頁(yè)源文件的方法進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-05-05總結(jié)C#動(dòng)態(tài)調(diào)用WCF接口的兩種方法
這篇文章給大家總結(jié)了C#動(dòng)態(tài)調(diào)用WCF接口的兩種方法,大家可以根據(jù)自己的需求選擇對(duì)應(yīng)的方式,下面來(lái)一起看看。2016-09-09C#使用Task實(shí)現(xiàn)執(zhí)行并行任務(wù)的原理的示例詳解
Task是一個(gè)表示異步操作的類,它提供了一種簡(jiǎn)單、輕量級(jí)的方式來(lái)創(chuàng)建多線程應(yīng)用程序。本文就來(lái)和大家聊聊在C#中如何使用Task執(zhí)行并行任務(wù)吧2023-04-04微信公眾平臺(tái)開發(fā)教程(三) 基礎(chǔ)框架搭建
這篇文章主要介紹了微信公眾平臺(tái)開發(fā)教程(三) 基礎(chǔ)框架搭建,具有一定的參考價(jià)值,有需要的可以了解一下。2016-12-12C# 字符串、數(shù)組和List的截取和轉(zhuǎn)換實(shí)例
下面小編就為大家分享一篇C# 字符串、數(shù)組和List的截取和轉(zhuǎn)換實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2017-11-11