两个方法。第一个方法相对较为复杂。
第一个方法是把传入的罗马数字,每一个相对应的转为整数,再通过比较写入ArrayList集合的数据大小,进行判断加或减。(由于集合中的对象,是Object,比较的时候,需要的又是整数类型,所以需要强转)。int类型无法使用String.valueOf()进行强转,所以要用integer包装类。
第二个方法是利用逆序数遍历。由于罗马数字的运算法则最后一个一定为加法,所以遍历从倒数第二个开始。
下面是代码:
法一:
1. import java.util.ArrayList; 2. 3. 4. public class leetCode_13_Method1 { 5. public int romanToInt(String s) { 6. int sum = 0; 7. 8. ArrayList arr = new ArrayList(); 9. setDate(s, arr); 10. 11. for (int i = arr.size() - 2; i >= 0; i--) { 12. int j = i + 1; 13. int dateI = Integer.parseInt(String.valueOf(arr.get(i))); 14. int dateJ = Integer.parseInt(String.valueOf(arr.get(j))); 15. 16. if (dateJ > dateI) { 17. sum -= dateI; 18. } 19. if (dateJ <= dateI) { 20. sum += dateI; 21. } 22. } 23. 24. sum += Integer.parseInt(String.valueOf(arr.get(arr.size() - 1))); 25. 26. return sum; 27. } 28. 29. public static void setDate(String s, ArrayList arr) { 30. for (int i = 0; i < s.length(); i++) { 31. char ch = s.charAt(i); 32. String string = Character.toString(ch); 33. 34. if (string.equals("I")) { 35. arr.add("1"); 36. } 37. if (string.equals("V")) { 38. arr.add("5"); 39. } 40. if (string.equals("X")) { 41. arr.add("10"); 42. } 43. if (string.equals("L")) { 44. arr.add("50"); 45. } 46. if (string.equals("C")) { 47. arr.add("100"); 48. } 49. if (string.equals("D")) { 50. arr.add("500"); 51. } 52. if (string.equals("M")) { 53. arr.add("1000"); 54. } 55. } 56. 57. } 58. }
法二:
1. public class leetCode_13_Method2 { 2. 3. public static int romanToInt(String s) { 4. 5. int sum = 0; 6. char[] ch = s.toCharArray(); 7. 8. 9. for (int i = ch.length - 2; i >= 0; i--) { 10. int j = i + 1; 11. if (getValue(ch[j]) > getValue(ch[i])) { 12. sum = sum - getValue(ch[i]); 13. } else if (getValue(ch[j]) <= getValue(ch[i])) { 14. sum = sum + getValue(ch[i]); 15. } 16. 17. } 18. sum = sum + getValue(ch[ch.length - 1]); 19. return sum; 20. } 21. 22. private static int getValue(char chUnit) { 23. switch (chUnit) { 24. case 'I': 25. return 1; 26. case 'V': 27. return 5; 28. case 'X': 29. return 10; 30. case 'L': 31. return 50; 32. case 'C': 33. return 100; 34. case 'D': 35. return 500; 36. case 'M': 37. return 1000; 38. default: 39. return 0; 40. } 41. } 42. }