將羅馬數字的字串轉換為數字。
https://leetcode.com/problems/roman-to-integer/
羅馬數字由7種文字組成
Symbol ValueI 1V 5X 10L 50C 100D 500M 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
X 如果寫在 L 或 C 的左側,則組合為 40 或 90
C 如果寫在 D 或 M 的左側,則組合為 400 或 900
範例
Input: s = "MCMXCIV"
Output: 1994Explanation: 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;
}
沒有留言:
張貼留言