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 2019-03-30 13:20  会飞的金鱼  阅读(350)  评论(0)    收藏  举报