Given a roman numeral, convert it to an integer.
Input is guaranteed to be within the range from 1 to 3999.
搞了挺久一直没搞出来。看了网上的参考后知道是推导的公式写错了。如果是从高位往地位扫(也就是一次循环用s.charAt(i)由高往低),那么相邻元素之间的关系是:1当前元素如果是最高位,先加上对应的元素 2 如果当前元素roman[s.charAt(i)] 比上一个元素roman[s.charAt(i-1)]的数字大,那么由于上一个循环已经加过一次 roman[s.charAt(i-1)],所以需要减去两倍的roman[s.charAt(i-1)],先抵消上一回多加的,然后再正常减去一个。
实现代码:
其实我觉也可以反向循环做这道题,判断roman[s.charAt(i)] 跟roman[s.charAt(i+1)] 的大小关系,有机会补上。
public class Solution {
public int romanToInt(String s) {
int []roman = new int[256];
roman['I']=1;
roman['V']=5;
roman['X']=10;
roman['L']=50;
roman['C']=100;
roman['D']=500;
roman['M']=1000;
int result=0;
result =roman[s.charAt(0)];
for(int i=1;i<s.length();i++){
int location =s.charAt(i);
int locationP = s.charAt(i-1);
if(i==0){
result =roman[location];
//System.out.println("init: "+roman[location]);
continue;
}
if(roman[locationP]< roman[location]){
result += roman[location] -2*roman[locationP];
// System.out.println("-: roman[location],roman[location+1]"+roman[location]+" "+roman[location+1]);
}
else{
result+=roman[location] ;
// System.out.println("+: "+roman[(char)location]);
}
}
return result;
}
}