iT邦幫忙

2023 iThome 鐵人賽

DAY 9
0

2629. Function Composition

解題程式碼

// 解法 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)

2637. Promise Time Limit

解題程式碼

解法 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 就會被回傳。

解法的時間、空間複雜度

參考資料

2665. Counter II

解題程式碼

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)

2704. To Be Or Not To Be

解題程式碼

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)


上一篇
Day8-[30 Days of JavaScript] LeeCode 2622、2623、2625
下一篇
Day10-[30 Days of JavaScript] LeeCode 2705、2715、2722、2723
系列文
那些年我沒寫到的資料結構和 LeetCode 題目練習30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言