leetcode刷题之Roman to Integer(13)

罗马数由七个数字组成:I, V, X, L, C, D,M.

Symbol Value
I 1
V 5
X 10
L 50
C 100
D 500
M 1000

2可以用II表示,即两个一一起。12写作XII,即X+II。27写作XXVII即XX+V+II.

罗马数一般从左到右由大到小,但是4并不是写作IIII而是IV,因为I写在V前面所以就是V-I等于4.以下是一些可以用的减法法则:

  • I可以放在 V (5)和 X (10) 来表示4和9
  • X可以放在L (50) 和C (100)来表示40和90
  • C可以放在D (500)和M (1000)来表示400和900

题目:给出一个罗马数字,将其转换成整型(Integer),罗马数字的范围在1到3099之间。I-MMMIC

思路:先统计单个罗马数出现次数,每次出现加上其值。再查看特殊数字IV,IX,XL,XC,CD和CM是否出现,每次出现减去对应的I,X以及C的双倍值(统计的时候加了一次其代表的值,这里需要减去双倍)

代码:

Java

public static int solution(String s){

    int sum=0;

    //计算的时候会将被减去的数加回来,所以需要减去双倍的数
    if(s.indexOf("IV") != -1){
        sum-=2;
    }
    if(s.indexOf("IX") != -1){
        sum-=2;
    }
    if(s.indexOf("XL") != -1){
        sum-=20;
    }
    if(s.indexOf("XC") != -1){
        sum-=20;
    }
    if(s.indexOf("CD") != -1){
        sum-=200;
    }
    if(s.indexOf("CM") != -1){
        sum-=200;
    }

    char[] nums=s.toCharArray();

    for(int i=0;i<s.length();i++){
        if(nums[i] == 'I'){
            sum+=1;
        }
        if(nums[i] == 'V'){
            sum+=5;
        }
        if(nums[i] == 'X'){
            sum+=10;
        }
        if(nums[i] == 'L'){
            sum+=50;
        }
        if(nums[i] == 'C'){
            sum+=100;
        }
        if(nums[i] == 'D'){
            sum+=500;
        }
        if(nums[i] == 'M'){
            sum+=1000;
        }
    }

    return sum;
}

猜你喜欢

转载自www.cnblogs.com/Simon-cat/p/10162526.html