來刷 LeetCode 吧! 09 13. Roman to Integer
LeetCode
題目分析
將羅馬數字轉換為整數。
需要注意 4、9、40、90、400、900 的表示方式。
第一直覺
直接暴力破解,用 for 迴圈遍歷整個字串,在使用 if 判斷。
當 s[ i ] 為多少的判斷:
- s[ i ] = “I” = 1
- s[ i + 1 ] = “V” = 4
- s[ i + 1] = “X” = 9
- s[ i ] = “V” = 5
- s[ i ] = “X” = 10
- s[ i + 1 ] = “L” = 40
- s[ i + 1 ] = “C” = 90
- s[ i ] = “L” = 50
- s[ i ] = “C” = 100
- s[ i + 1 ] = “D” = 400
- s[ i + 1 ] = = “M” = 900
- s[ i ] = “D” = 500
- s[ i ] = “M” = 1000
var romanToInt = function (s) { let sum = 0; for (let i = 0; i < s.length; i++) { if (s[i] === "I") { if (s[i + 1] === "V") { sum += 4; i++; } else if (s[i + 1] === "X") { sum += 9; i++; } else { sum += 1; } } else if (s[i] === "V") { sum += 5; } else if (s[i] === "X") { if (s[i + 1] === "L") { sum += 40; i++; } else if (s[i + 1] === "C") { sum += 90; i++; } else { sum += 10; } } else if (s[i] === "L") { sum += 50; } else if (s[i] === "C") { if (s[i + 1] === "D") { sum += 400; i++; } else if (s[i + 1] === "M") { sum += 900; i++; } else { sum += 100; } } else if (s[i] === "D") { sum += 500; } else if (s[i] === "M") { sum += 1000; } } return sum; };
優化寫法
我們自己建立一個 “”map” 做資料的檢索。
並且判斷 s[ i ] 是否大於 s[ i + 1]。
var romanToInt = function (s) { const map = { I: 1, V: 5, X: 10, L: 50, C: 100, D: 500, M: 1000, }; let result = 0; for (let i = 0; i < s.length; i++) { if (map[s[i]] < map[s[i + 1]]) { result -= map[s[i]]; } else { result += map[s[i]]; } } return result; };