1. 程式人生 > >前端演算法:羅馬數字變成阿拉伯數字 羅馬數字是由七個不同的符號來表示I,V,X,L,C,D和M

前端演算法:羅馬數字變成阿拉伯數字 羅馬數字是由七個不同的符號來表示I,V,X,L,C,D和M

羅馬數字是由七個不同的符號來表示I,V,X,L,C,D和M。
鍵:值
I 1
V 5
X 10
L 50
C 100
D 500
M 1000
例如,兩個用II 羅馬數字寫成,只有兩個加在一起。十二寫為,XII簡稱X+ II。數字二十七寫為XXVII,XX+ V+ II。
羅馬數字通常從左到右從最大到最小。但是,四個數字不是IIII。相反,第四個被寫為IV。因為一個在五個之前,我們減去四個。同樣的原則適用於編號為9的數字IX。

在這裡插入圖片描述
有六個使用減法的例項:
I可以在V(5)和X(10)之前放置4和9。
X可以在L(50)和C(100)之前放置40和90。
C可以在D(500)和M(1000)之前放置以產生400和900。
給定羅馬數字,將其轉換為整數。輸入保證在1到3999的範圍內。
例1:
輸入: ‘III’
輸出: 3
例2:
輸入: ‘IV’
輸出: 4
例3:
輸入: ‘IX’
輸出: 9
例4:
輸入: ‘LVIII’
輸出: 58
說明: L = 50,V = 5,III = 3。
例5:
輸入: ‘MCMXCIV’
輸出: 1994
說明: M = 1000,CM = 900,XC = 90,IV = 4。

<script>
var romanToInt1 = function(s) {
    const map = {
        I: 1,
        V: 5,
        X: 10,
        L: 50,
        C: 100,
        D: 500,
        M: 1000
    };
    let i = s.length;
    let result = 0;
    while (i--) {
        const curr = map[s.charAt(i)];
        const prev = map[s.charAt(i - 1)];
        result += curr; 
        if (prev < curr) {
            result -= prev; 
            i -= 1;
        }
    }
    return result;
};
console.log(romanToInt1('MCMXCIV'));
// 從右側開始。如果左邊的一個索引值小於當前索引處的值,則獲取兩者的值,然後減去它們。然後,加上你的總和。最後,遞減索引以跳過它。
var romanToInt2 = function(s) {
    const valueMap = {"M":1000,"D":500,"C":100,"L":50,"X":10,"V":5,"I":1};
    let sum = 0;    
    for(let i = s.length-1; i >= 0; i--) {
        let char = valueMap[s[i]];
        let nextChar = valueMap[s[i-1]];
        if(nextChar < char) {
            sum+=(char-nextChar);
            i--;
        } else {
            sum+=char;
        }
    }
    return sum;
};
console.log(romanToInt2('MCMXCIV'));
</script>