iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 2
0
自我挑戰組

用LeetCode來訓練大腦的邏輯思維系列 第 2

LeetCode 12. Integer to Roman

  • 分享至 

  • xImage
  •  

題目

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

題意

使用羅馬數字來表示整數,例如:
7 >> V(5)+II(2) >> VII
27 >> XX(20)+V(5)+II(2) >> XXVI

若遇到49這兩種數字,表示法會不一樣。
4不會是IIII,而是IV,相當於5-1的意思,9不會是VIIII,而是IX,相當於10-1的意思,
以此類推,40 >> XL90 >> XC

輸入的範圍介於1 to 3999

Example 1:

Input: 3
Output: III

Example 2:

Input: 4
Output: IV

Example 3:

Input: 9
Output: IX

Example 4:

Input: 58
Output: LVIII

解題步驟

每個符號代表一個數值,這樣的概念類似於另一個經典的練習題:收銀機,找錢時,需要500元幾張,100元幾張,50元幾枚...。

所以我們可以將這些符號當作幣值:

let val = [1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1];
let roman = ['M', 'CM', 'D', 'CD', 'C', 'XC', 'L', 'XL', 'X', 'IX', 'V', 'IV', 'I'];

假設輸入的參數num=3999
需要MMM(3000)+CM(900)+XC(90)+IX(9)=MMMCMXCIX

符號重複次數 = num / 符號的值 ,取商數

count = parseInt(num / val[i]);

剩下的數值 = num / 符號的值,取餘數

num = num % val[i];

重複符號該如何串接?
可以使用String API repeat()
例如M要重複3次:

roman[0].repeat(3);

第一次算出的結果為MMM,接著取餘數(999),再次運算。
這邊就要使用迴圈了,終止條件,以val的長度為基準。

Solution

var intToRoman = function(num) {
  let val = [1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1];
  let roman = ['M', 'CM', 'D', 'CD', 'C', 'XC', 'L', 'XL', 'X', 'IX', 'V', 'IV', 'I'];
  let romNum = '';
  let len = val.length;
  for (let i = 0; i < len; i++) {
    if (num >= val[i]) {
      let count = parseInt(num / val[i]);
      num = num % val[i];
      romNum += roman[i].repeat(count);
    }
  }
  return romNum;
};

上一篇
LeetCode 9. Palindrome Number
下一篇
LeetCode 7. Reverse Integer
系列文
用LeetCode來訓練大腦的邏輯思維30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言