// 解法 1. 最簡潔
const compose = (fs) => (x) => fs.reduceRight((a, f) => f(a), x);
// 解法 2. 好懂
const compose = function (functions) {
return function (x) {
for (let i = functions.length - 1; i >= 0; i--) {
x = functions[i](x);
}
return x;
};
};
這題考的是實作 functional programming 的 compose,第二個解法的 reduceRight 改成 reduce 就是 pipe,讀者可以自行搜尋這兩種函式。
要解開題目就是將傳入的陣列參數內的多個函式都執行一次,記得每次計算後的結果要儲存,最後回傳最終計算結果即可。
時間複雜度: O(n)
空間複雜度: O(1)
解法 1.
var timeLimit = function (fn, t) {
return async function (...args) {
return new Promise((resolve, reject) => {
let timeId = setTimeout(() => {
reject('Time Limit Exceeded');
}, t);
fn(...args)
.then((res) => resolve(res))
.catch((err) => reject(err))
.finally(() => clearTimeout(timeId));
});
};
};
解法 2.
var timeLimit = function (fn, t) {
return async function (...args) {
const promiseFn = fn(...args);
const timeLimitPromise = new Promise((_, reject) => {
setTimeout(() => {
reject('Time Limit Exceeded');
}, t);
});
return Promise.race([promiseFn, timeLimitPromise]);
};
};
看題目描述會需要處理到非同步函式的 resolve、reject 情況,只要超過時間限制就會 reject,這種情況可以想到使用 Promise,所以解法 1 中去 return 一個 Promise,裡面就可以處理 resolve、reject,reject 會在時間限制到時觸發,而 resolve 就依照非同步的 fn 處理。
解法 2 使用 Promise.race()
,它接受一個包含 Promise 當作元素的陣列,只回傳傳入的 Promie 陣列中第一個被 resolve/reject 的 Promise 物件。所以我們將原本的非同步函式、會 reject 的 Promise 物件加到 Promise.race()
內,先執行完成的 Promise 就會被回傳。
var createCounter = function (init) {
let count = 0;
return {
increment() {
return init + ++count;
},
decrement() {
return init + --count;
},
reset() {
count = 0;
return init;
},
};
};
就是考閉包的應用
時間複雜度: O(1)
空間複雜度: O(1)
var expect = function (val) {
return {
toBe: (checkVal) => {
if (val === checkVal) {
return true;
} else {
throw new Error('Not Equal');
}
},
notToBe: (checkVal) => {
if (val !== checkVal) {
return true;
} else {
throw new Error('Equal');
}
},
};
};
可以 Google function chaining
時間複雜度: O(1)
空間複雜度: O(1)