【LeetCode】解析_13 Roman to Integer

網址出自:

https://leetcode.com/problems/roman-to-integer/

 

easy程度

目前來練~刷看看~ 題目如下:

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

題意

將整數轉羅馬數字

若遇到4跟9這兩種數字,表示法會不一樣。

4不會是IIII,而是IV,相當於5-1的意思,(V=5;I=1)

9不會是VIIII,而是IX,相當於10-1的意思,(X=10;I=1)

以此類推,40 = XL,90 = XC。輸入的範圍介於1 to 3999。

(XL: X= 10; L =50;) (XC :X = 10; L =100;)

Input: s = "MCMXCIV"

Output: 1994

Explanation: M = 1000, CM = 900, XC = 90 and IV = 4.

MC = 1000(m)-100(c) = 900

M = 1000

倒過來 XC = 1000(c)-10(x) =90

倒過來 IV = 5(V)-1(I) =4


小嫩嫩如我一開始會想用 switch case 方法來寫

我的想法一開始為如果 開頭為這些數字的話 我就給他多少值

剩下的用foreach去解 他是哪個值再用

	// 最後總和
	var result = 0;
	
	switch(s.Substring(0,1)){
         case "I":
            result = 1;
               break;
         case "V":
             result = 5;
              break;
         case "X":
             result = 10;
             break; 
         case "L":
             result = 50;
             break;
         case "C":
             result = 100;
             break;
         case "D":
             result = 500;
             break;
         case "M":
             result = 1000;
             break;                
    }

寫到一半就覺得 "不對喔"

程式碼太蠢了吧,我這樣要每個數字都要判斷好幾次

於是就在想了一下….

為何不先把這些一值用到的東西抽出來

抽成像是字典的東西

然後foreach 每個字去做比對

Dictionary<char, int> dic=new Dictionary<char, int> { { 'I', 1}, { 'V', 5}, { 'X', 10}, { 'L', 50}, { 'C', 100}, { 'D', 500}, { 'M', 1000} };

解法:

規則是什麼?

我們可以發現 這個規則是
由左至右 也就是從大到小去排列
若左邊大於右邊,就相加,若左邊小於右邊,就相減

下一個數字是否大於目前數字

 

使用字典 

解法 

static void Main(string[] args)
        {
            var str3 = "MCMXCIV";
            var result3 = RomanToInt(str3);
        }
        
        static public int RomanToInt(string romanString)
        {
            var result = 0;

            Dictionary<char, int> dic = new Dictionary<char, int>
            {
                { 'I', 1 },
                { 'V', 5 },
                { 'X', 10 },
                { 'L', 50 },
                { 'C', 100 },
                { 'D', 500 },
                { 'M', 1000 }
            };

            for (int i = 0; i < romanString.Length; i++)
            {                
                int val = dic[romanString[i]];
                
                var x = i == romanString.Length - 1;
                 
                if (i == romanString.Length - 1 || dic[romanString[i + 1]] <= dic[romanString[i]])
                {
                    result += val;
                }
                else
                {
                    result -= val;
                }
            }
            
            return result;
        }

更多方法:

連結

主要是做我的學習筆記

偶而心血來潮寫個幾篇~

若有問題~可以寫信或在下方留言~感謝