2022年7月9日 星期六

13. Roman to Integer

 將羅馬數字的字串轉換為數字。

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

羅馬數字由7種文字組成
Symbol           Value
I                          1
V                         5
X                         10
L                         50
C                         100
D                         500
M                        1000
每種組合都是用相加的方式來計算,舉幾個例子
II = I + I = 2
XII = X + I + I = 10 + 1 + 1 = 12
XXVII = X + X + V + I + I = 10 + 10 + 5 + 1 + 1 = 27

比較需要注意的是下面幾種組合
I 如果寫在 V 或 X 的左側,則組合為 4 或 9
X 如果寫在 L 或 C 的左側,則組合為 40 或 90
C 如果寫在 D 或 M 的左側,則組合為 400 或 900

範例
Input: s = "MCMXCIV"
Output: 1994
Explanation: M = 1000, CM = 900, XC = 90 and IV = 4.

所以只要碰到I時檢查他的右邊是否為VX、X檢查LC、C檢查DM,如果是的話改為減去自身數字即可。

	public int romanToInt(String s) {
		/*
		 * I 1 , V 5 , X 10
		 * 
		 * X 10 , L 50 , C 100
		 * 
		 * C 100 , D 500 , M 1000
		 */
		int ans = 0;
		char[] str = s.toCharArray();

		for (int i = 0; i < str.length; i++) {
			char x = str[i];
			switch (x) {
			//檢查各元素轉換後的數字
			case 'M':
				ans = ans + 1000;
				break;
			case 'D':
				ans = ans + 500;
				break;
			case 'C':
				if (i + 1 < str.length && (str[i + 1] == 'D' || str[i + 1] == 'M')) {
					//C 如果寫在 D 或 M 的左側,會變-100
					ans = ans - 100;
				} else {
					ans = ans + 100;
				}
				break;
			case 'L':
				ans = ans + 50;
				break;
			case 'X':
				if (i + 1 < str.length && (str[i + 1] == 'L' || str[i + 1] == 'C')) {
					//X 如果寫在 L 或 C 的左側,會變-10
					ans = ans - 10;
				} else {
					ans = ans + 10;
				}
				break;
			case 'V':
				ans = ans + 5;
				break;
			case 'I':
				if (i + 1 < str.length && (str[i + 1] == 'V' || str[i + 1] == 'X')) {
					//I 如果寫在 V 或 X 的左側,會變-10
					ans = ans - 1;
				} else {
					ans = ans + 1;
				}
				break;
			}
		}
		return ans;
	}

沒有留言:

張貼留言