【羅馬數字轉整數】算法優化筆記

給定一個羅馬數字,將其轉換成整數。

羅馬數字包含以下七種字符: 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.

來源:力扣(LeetCode) 鏈接:https://leetcode-cn.com/problems/roman-to-integer

初步分析
  1. 將各類情況放入哈希表,逐個查詢表中符合的情況。
  2. 歸納特殊情況加減關係。

本章總結

【小總結】
1.【哈希表的使用】
2.【關係的歸納】

詳細代碼

哈希表版
public class Solution {
    public int RomanToInt(string s) {
            int sum = 0;
            Dictionary<string, int> dic = new Dictionary<string, int>();
            dic.Add("I", 1);
            dic.Add("IV", 4);
            dic.Add("V", 5);
            dic.Add("IX", 9);
            dic.Add("X", 10);
            dic.Add("XL", 40);
            dic.Add("L", 50);
            dic.Add("XC", 90);
            dic.Add("C", 100);
            dic.Add("CD", 400);
            dic.Add("D", 500);
            dic.Add("CM", 900);
            dic.Add("M", 1000);

            for (int i = s.Length-1; i >=0 ; i--)
            {
                if (i > 0)
                {
                    if (dic.ContainsKey(s[i - 1].ToString() + s[i].ToString()))
                    {
                        sum = sum + dic[s[i - 1].ToString() + s[i].ToString()];
                        i--;
                    }
                    else
                        sum = sum + dic[s[i].ToString()];
                }
                else
                {
                    sum = sum + dic[s[i].ToString()];
                }             
            }

            return sum;
    }
}
關係歸納版
public class Solution {
    public int RomanToInt(string s) {
        int sum = 0;
        int preNum = getValue(s[0]);
        for(int i = 1;i < s.Length; i ++) {
            int num = getValue(s[i]);
            if(preNum < num) {
                sum -= preNum;
            } else {
                sum += preNum;
            }
            preNum = num;
        }
        sum += preNum;
        return sum;

    }
    private int getValue(char ch) {
        switch(ch) {
            case 'I': return 1;
            case 'V': return 5;
            case 'X': return 10;
            case 'L': return 50;
            case 'C': return 100;
            case 'D': return 500;
            case 'M': return 1000;
            default: return 0;
        }
    }
}
	位運算符:

	(a & b)
	按位與運算符:參與運算的兩個值,如果兩個相應位都爲1,則該位的結果爲1,否則爲0
	輸出結果 12 ,二進制解釋: 0000 1100

	(a | b)
	按位或運算符:只要對應的二個二進位有一個爲1時,結果位就爲1。
	輸出結果 61 ,二進制解釋: 0011 1101

	(a ^ b)
	按位異或運算符:當兩對應的二進位相異時,結果爲1
	輸出結果 49 ,二進制解釋: 0011 0001

	(~a )
	按位取反運算符:對數據的每個二進制位取反,即把1變爲0,把0變爲1 。~x 類似於 -x-1
	輸出結果 -61 ,二進制解釋: 1100 0011,在一個有符號二進制數的補碼形式。

	a << 2
	左移動運算符:運算數的各二進位全部左移若干位,由 << 右邊的數字指定了移動的位數,高位丟棄,低位補0。
	輸出結果 240 ,二進制解釋: 1111 0000

	a >> 2
	右移動運算符:把">>"左邊的運算數的各二進位全部右移若干位,>> 右邊的數字指定了移動的位數
	輸出結果 15 ,二進制解釋: 0000 1111

	賦值運算符:

	*= 乘法賦值運算符 c *= a 等效於 c = c * a
	/= 除法賦值運算符 c /= a 等效於 c = c / a
	%= 取模賦值運算符 c %= a 等效於 c = c % a
	**= 冪賦值運算符 c **= a 等效於 c = c ** a
	//= 取整除賦值運算符 c //= a 等效於 c = c // a

作者:boywithacoin_cn
鏈接:https://leetcode-cn.com/problems/reverse-integer/solution/pythondan-chu-he-tui-ru-shu-zi-yi-chu-qian-jin-xin/
來源:力扣(LeetCode) 著作權歸作者所有。商業轉載請聯繫作者獲得授權,非商業轉載請註明出處。

以下是個人初步版本垃圾代碼僅供參考

public class Solution {
    public int RomanToInt(string s) {
 Stack<char> stack = new Stack<char>(s.Length);
            int sum = 0;
            for (int i = s.Length - 1; i >= 0; i--)
            {
                switch (s[i])
                {
                    case 'I':
                        {
                            if (stack.Count==0|| (stack.Peek() != 'V' && stack.Peek() != 'X'))
                                sum = sum + 1;
                            else
                                sum = sum - 1;
                            break;
                        }
                    case 'V':
                        sum = sum + 5;
                        break;
                    case 'X':
                        {
                            if (stack.Count == 0 || (stack.Peek() != 'L' && stack.Peek() != 'C'))
                                sum = sum + 10;
                            else
                                sum = sum - 10;
                            break;
                        }
                    case 'L':
                        sum = sum + 50;
                        break;
                    case 'C':
                        {
                            if (stack.Count == 0 || (stack.Peek() != 'D' && stack.Peek() != 'M'))
                                sum = sum + 100;
                            else
                                sum = sum - 100;
                            break;
                        }
                    case 'D':
                        sum = sum + 500;
                        break;
                    case 'M':
                        sum = sum + 1000;
                        break;
                }
                stack.Push(s[i]);

            }
                return sum;
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章