解题思想:
前后指针
左边比右边小 做减法
左边比右边大 做加法
最后一个数字直接加。
package keepcoding.leetcode.leetcode13;public class Result02 {public static void main(String[] args) {int result = romanToInt("XIV");System.out.println(result);}public static int romanToInt(String s) {//sum用于记录总和int sum = 0;//类似双指针 preNUM num//初始pre在0 num 在1int preNum = getValue(s.charAt(0));//String类的CharAt(int i)方法——返回i位置上的字符for(int i = 1;i < s.length(); i ++) {int num = getValue(s.charAt(i));//左边大于右边做减法if(preNum < num) {sum -= preNum;} else {//否则做加法sum += preNum;}//运算完后,前指针 后移preNum = num;}//最后一位直接相加sum += preNum;return sum;}private static 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;}}}
官方解:
package keepcoding.leetcode.leetcode13;import java.util.HashMap;public class Result01 {public static void main(String[] args) {int result = romanToInt("MCMXCIV");System.out.println(result);}public static int romanToInt(String s){//建立转换表HashMap<Character, Integer> map = new HashMap<Character,Integer>();map.put('I',1);map.put('V', 5);map.put('X', 10);map.put('L', 50);map.put('C', 100);map.put('D', 500);map.put('M', 1000);//定义result 用于记录返回的结果int result = 0;for (int i = 0; i < s.length(); i++) {//s.charAt(i)返回字符串s在i位置上的字符;map.get(key) 获取哈希表对应键的值int value = map.get(s.charAt(i));//i < s.length()-1 防// 止i+1越界if (i< s.length()-1 && value <map.get(s.charAt(i+1))){//左边比右边小 相减result -= value;}else{result += value;}}return result;}
}