Roman to Integer

一 問題描述

Roman to Integer

Roman numerals are represented by seven different symbols: I, V, X, L, C, D and M.

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

For example, two is written as II in Roman numeral, just two one’s added together. Twelve is written as, XII, which is simply X + II. The number twenty seven is written as XXVII, which is XX + V + II.

Roman numerals are usually written largest to smallest from left to right. However, the numeral for four is not IIII. Instead, the number four is written as IV. Because the one is before the five we subtract it making four. The same principle applies to the number nine, which is written as IX. There are six instances where subtraction is used:

    1. I can be placed before V (5) and X (10) to make 4 and 9.
    1. X can be placed before L (50) and C (100) to make 40 and 90.
    1. C can be placed before D (500) and M (1000) to make 400 and 900.

Given a roman numeral, convert it to an integer. Input is guaranteed to be within the range from 1 to 3999.

翻譯:

羅馬數字轉換成整數。一般情況下,羅馬數字從左到右是從大到小。特殊情況下,會有左邊的小於右邊的,此時用右邊一個減去左邊一個。這種情況有:

    1. I可以在V和X的左邊組合成4和9;
    1. X可以在L和C的左邊組合成40和90;
    1. C可以在D和M的左邊組合成400和900;

二 解法

1. 第一解法(個人)

思路:

用一個對象存儲羅馬數字和整數的映射關係。然後循環判斷,如果左邊小於右邊,就用右邊減去左邊然後索引自增2。否則直接相加。

代碼:

var romanToInt = function(s) {
    
    let roman = {
        'I': 1, 'V': 5, 'X': 10, 'L': 50, 'C': 100, 'D': 500, 'M': 1000
    }
    let num = 0;
    
    for (let i = 0; i < s.length; i++) {
        if(s[i+1])
            if (roman[s[i]] >= roman[s[i+1]]) {
                num += roman[s[i]];
            } else {
                num += (roman[s[i+1]] - roman[s[i]]);
                i++; 
            }
        else
            num += roman[s[i++]];
    }
    return num;
    
};

結果:

3999 / 3999 test cases passed.
Status: Accepted
Runtime: 140 ms
Memory Usage: 39.9 MB

2. 第二解法(社區)

思路:

與第一解法一樣,但在循環時,不將一個逆序對看作一個整體,而是左邊小於右邊直接將左邊的數字和結果整數相減,否則相加,這樣省去了判斷索引是否是最後一個。

代碼:

let map = {
    'M' : 1000, 'D' : 500, 'C' : 100, 'L' : 50,
    'X' : 10, 'V' : 5, 'I' : 1,
};
var romanToInt = function(s) {
  let result = 0

  for (i=0;i<s.length-1;i++){
    if(map[s[i]] < map[s[i+1]]){
      result -= map[s[i]]
    } else{
      result += map[s[i]]
    }
  }
  result += map[s[s.length-1]]
  
  return result
};

結果:

Runtime: 128 ms, faster than 97.10% of JavaScript online submissions for Roman to Integer.
Memory Usage: 39.6 MB, less than 83.75% of JavaScript online submissions for Roman to Integer

By DoubleJan
2019.7.8

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章