題目: Given a roman numeral, convert it to an integer.Input is guaranteed to be within the range from 1 to 3999. 官方難度: Easy 翻譯: 給定一個羅馬數字,翻譯成一個阿拉伯數字的整數形式 ...
題目:
Given a roman numeral, convert it to an integer.
Input is guaranteed to be within the range from 1 to 3999.
官方難度:
Easy
翻譯:
給定一個羅馬數字,翻譯成一個阿拉伯數字的整數形式。輸入的羅馬數字範圍在1-3999之間。
思路:
1. 羅馬數字規則見上一章No.012。
2. 輸入不考慮非羅馬數字的形式,或者是錯誤的羅馬數字形式(如IVI)。
3. 需要一個羅馬字元,轉譯成數字的字典方法。
4. 依次讀取輸入字元串的對應位置的羅馬數字,累加。
5. 需要考慮4和9的特殊情況。維護一個previous的int型的變數,用來記錄上一個羅馬字元串代表的數字,發現當前數字的值是previous的5倍或是10倍,即為4和9的情況,減回去。
解題中可能遇到的困難:
1. 出現4和9的情況,減回去的值是previous的兩倍,因為之前已經累加過一次previous了。
2. previous賦初值的時候,不要影響第一次計算,因為會判斷current/previous的值,可以給一個負值,或者加一個i!=0的條件,將判斷從第一次迴圈中摒棄。
3. 在創建字典方法的時候,一般會採取switch-case-default結構,在Java7之前,switch後面的括弧里的變數類型,是不能為String類型的,因此儘量採用char類型來保存羅馬數字。
解題代碼:
1 // 不考慮非法的羅馬字元串形式 2 private static int method(String roman) { 3 char[] array = roman.toCharArray(); 4 int sum = 0; 5 // 上一個字元串代表的值,賦初始值不要影響第一次計算 6 int previous = -1; 7 int current; 8 for (int i = 0; i < array.length; i++) { 9 current = romanDict(array[i]); 10 // 特殊的4、9處理 11 if (current / previous == 5 || current / previous == 10) { 12 sum -= 2 * previous; 13 } 14 sum += current; 15 previous = current; 16 } 17 return sum; 18 } 19 20 // 羅馬數字轉化字典 21 private static int romanDict(char str) { 22 switch (str) { 23 case 'I': 24 return 1; 25 case 'V': 26 return 5; 27 case 'X': 28 return 10; 29 case 'L': 30 return 50; 31 case 'C': 32 return 100; 33 case 'D': 34 return 500; 35 case 'M': 36 return 1000; 37 default: 38 return 0; 39 } 40 }View Code
測試代碼地址:
https://github.com/Gerrard-Feng/LeetCode/blob/master/LeetCode/src/com/gerrard/algorithm/easy/Q013.java
LeetCode題目地址:
https://leetcode.com/problems/roman-to-integer/
PS:如有不正確或提高效率的方法,歡迎留言,謝謝!