1. 程式人生 > >leetcode刷題之Roman to Integer(13)

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;
}