欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C#算法之羅馬數(shù)字轉(zhuǎn)整數(shù)

 更新時(shí)間:2022年01月19日 08:34:20   作者:癡者工良  
本文詳細(xì)講解了C#算法之羅馬數(shù)字轉(zhuǎn)整數(shù),文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下

羅馬數(shù)字轉(zhuǎn)整數(shù)

羅馬數(shù)字包含以下七種字符: I, V, X, LC,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)文章

最新評(píng)論