解题思想:
前后指针
左边比右边小 做减法
左边比右边大 做加法
最后一个数字直接加。
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 在1
int 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;
}
}