-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathromanToInt.js
More file actions
49 lines (49 loc) · 1.22 KB
/
romanToInt.js
File metadata and controls
49 lines (49 loc) · 1.22 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
const utils = require("./Utils/utils");
/**
* @param {string} s
* @return {number}
*/
var romanToInt = function(s) {
let dic = [1, 5, 10, 50, 100, 500, 1000];
let lm = { I: 0, V: 1, X: 2, L: 3, C: 4, D: 5, M: 6 };
let pos = 0;
let i = s.length - 1;
let res = 0;
while (i >= 0) {
let n = s[i];
//dictionary find
let n_idx = lm[n];
//这里用 indexOf 会浪费一点搜索的时间
//直接hash 走起
if (n_idx > pos) {
pos = n_idx;
}
if (n_idx == pos) {
res += dic[pos];
}
if (n_idx < pos) {
res -= dic[n_idx];
}
//next
i--;
}
return res;
};
//最快的代码的启发 O(n)
var romanToIntV2 = function(s) {
let dic = [1, 5, 10, 50, 100, 500, 1000];
let lm = { I: 0, V: 1, X: 2, L: 3, C: 4, D: 5, M: 6 };
let res = 0;
s = s.split('').reverse().map(lt => dic[lm[lt]]);
s.forEach((num, i) => {
if (i > 0 && num < s[i - 1]) {
res -= num;
} else res += num;
});
return res;
};
//tdd
let t1 = "MCMXCIV";
let t2 = "IV";
let t3 = "VLIII";
utils.runTest(romanToIntV2, t1, t2, t3);