
VI=>6,IV=4
左边的数比右边的大,则是右边的数加上左边的;
左边的数比右边的小,则是右边的数减去左边的。
总结:
1)先找到罗马数字最大的那个数字,
2)要是左边的数比右边小,则是用右边的数减去左边的
3)要是左边的数比右边大,则是用右边的数加上左边的
4)重复前面的步骤
public class Solution{ public static void main(){ String romanString="IVIV"; int sum=romanToNumber(romanString,0,romanString.length()-1); System.out.println(sum); } //罗马数字与阿拉伯数字对照 public static int charToInt(char roman){ char[] chars={'I','V','X','L','C','D','M'}; char[] values={1,5,10,50,100,500,1000}; int value=0; for(int i=0;i<chars.length;i++){ if(chars[i]==roman){ value=values[i]; } } return value; } //找出规定范围的最大值所在的位置 public static int findMaxIndex(String romanStr,int left,int right){ if(romanStr==null||romanStr.length()==0){ return 0; } char[] chars=romanStr.toCharArray(); int max=charToInt(chars[left]); int maxIndex=left; for(int i=left;i<=right;i++){ int value=charToInt(chars[i]); if(value>max){ max=value; maxIndex=i; } } return maxIndex; } //递归的方法,计算出最终结果 public static int romanToNumber(String romanStr,int left,int right){ if(left==right){ return charToInt(romanStr.charAt(left)); }else if(left>right){ return 0; }else{ int maxIndex=findMaxIndex(romanStr,left,right); int max=charToInt(romanStr.charAt(maxIndex)); int lSum=romanToNumber(romanStr,left,maxIndex-1); int rSum=romanToNumber(romanStr,maxIndex+1,right); return max-lSum+rSum; } } }
posted on
浙公网安备 33010602011771号