C#算法之羅馬數字轉整數
羅馬數字轉整數
羅馬數字包含以下七種字符: I
, V
, X
, L
,C
,D
和 M
。
字符 數值 I 1 V 5 X 10 L 50 C 100 D 500 M 1000
例如, 羅馬數字 2 寫做 II
,即為兩個並列的 1。12 寫做 XII
,即為 X
+ II
。 27 寫做 XXVII
, 即為 XX
+ V
+ II
。
通常情況下,羅馬數字中小的數字在大的數字的右邊。但也存在特例,例如 4 不寫做 IIII
,而是 IV
。數字 1 在數字 5 的左邊,所表示的數等於大數 5 減小數 1 得到的數值 4 。同樣地,數字 9 表示為 IX
。這個特殊的規則隻適用於以下六種情況:
I
可以放在V
(5) 和X
(10) 的左邊,來表示 4 和 9。X
可以放在L
(50) 和C
(100) 的左邊,來表示 40 和 90。C
可以放在D
(500) 和M
(1000) 的左邊,來表示 400 和 900。
給定一個羅馬數字,將其轉換成整數。輸入確保在 1 到 3999 的范圍內。
示例 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.
筆者的方法:
時間200ms左右,
思路是
- 把所有的情況放到哈希表中
- 每次取一個位
- 把 i 和 i+1 放一起,試試有沒有區配的,有的話把 i 和 i+1 放一起
- 沒有的話,就是 隻是計 i
public class Solution { public int RomanToInt(string s) { char[] c = s.ToCharArray(); //將其轉為字符數組 int sum = 0; //值 Hashtable hashtable = new Hashtable(); //7個基本單位 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())) //如果發現兩位一起能區配的話 { 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(); //將其轉為字符數組 int sum = 0; //值 Dictionary<string, int> dictionary = new Dictionary<string, int>(); //7個基本單位 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])) //如果發現兩位一起能區配的話 { sum += dictionary[c[i].ToString() + c[i + 1].ToString()]; //獲取值,HashTable的類型都是Object! i++; //跳兩位 } else { sum += dictionary[c[i].ToString()]; } } return sum; } }
以上兩個例子都會進行較多的裝箱拆箱,下面主要使用if-else,switch,空間花銷較大,但是如果測試例子較多,進行大量計算,時間會相對少一點。
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; } }
到此這篇關於C#算法之羅馬數字轉整數的文章就介紹到這瞭。希望對大傢的學習有所幫助,也希望大傢多多支持WalkonNet。
推薦閱讀:
- 聊聊C# 中HashTable與Dictionary的區別說明
- C#實現十六進制與十進制相互轉換以及及不同進制表示
- C#中Hashtable和Dictionary的區別與用法示例
- C++表達式求值詳解
- C# 字符串與unicode互相轉換實戰案例