今天來給使用 JS 刷題的朋友分享三個 LeetCode 上你或許不知道的刷題技巧。html
首先穿插一個小知識:咱們提交的 JS 是如何被 LeetCode 執行的?
前端
咱們在力扣提交的代碼是放到力扣後臺運行的, 而 JS 代碼在力扣後臺是在 node 中以 --harmony 方式運行的。node
大概是這樣:git
node --harmony index.js
複製代碼
其中 index.js 就是你提交的代碼。github
好比:算法
// 前面 LeetCode 會添加一些代碼
function sum(a, b) {
// you code
}
// 這裏是 LeetCode 的測試用例
expect(sum(1, 2)).toBe(3);
expect(sum(1, 8)).toBe(9); // 若是測試用例不經過,則直接拋出錯誤給前端
複製代碼
所以 ES6 特性是徹底支持的,你們能夠放心使用。api
好比咱們能夠使用 ES6 的解構語法完成數組兩個值的交換。數組
[a, b] = [b, a];
複製代碼
以下就是使用了 ES6 的數組解構語法,更多 ES6+ 請參考相關文檔。markdown
在 LeetCode 中 lodash 默承認直接經過 _
訪問。數據結構
這是由於 LeetCode 直接將 lodash require 進來了。相似:
const _ = require("lodash");
// 前面 LeetCode 會添加一些代碼
function sum(a, b) {
// you code
// 你的代碼能夠經過 _ 訪問到 lodash 的全部功能。
}
// 這裏是 LeetCode 的測試用例
expect(sum(1, 2)).toBe(3);
expect(sum(1, 8)).toBe(9); // 若是測試用例不經過,則直接拋出錯誤給前端
複製代碼
lodash 有不少有用的功能可直接使用。西法建議你若是讓你手寫你可以寫出,那麼就能夠放心的使用 lodash 提供的功能。
好比數組拍平:
_.flatten([1, [2, [3, [4]], 5]]);
// => [1, 2, [3, [4]], 5]
複製代碼
再好比深拷貝:
var objects = [{ a: 1 }, { b: 2 }];
var deep = _.cloneDeep(objects);
console.log(deep[0] === objects[0]);
// => false
複製代碼
更多 API 可參考官方文檔。
爲了彌補 JS 內置數據結構的缺失。除了 JS 內置數據結構以外,LeetCode 平臺還對 JS 提供了兩種額外的數據結構,它們分別是:
這兩個數據結構都使用的是第三方 datastructures-js
實現的版本,代碼我看過了,仍是很容易看懂的。
LeetCode 提供了 JS 對隊列的支持。
// empty queue
const queue = new Queue();
// from an array
const queue = new Queue([1, 2, 3]);
複製代碼
其中 queue 的實現也是使用數組模擬。不過不是直接使用 shift 來刪除頭部元素,由於直接使用 shift 刪除最壞狀況時間複雜度是 。這裏它使用了一種標記技巧,即每次刪除頭部元素並非真的移除,而是標記其已經被移除。
這種作法時間複雜度能夠下降到 。只不過若是不停入隊和出隊,空間複雜度會很高,由於會保留全部的已經出隊的元素。所以它會在每次出隊超過一半的時候執行一次縮容(相似於數組擴容)。這樣時間複雜度會增大到 ,可是空間會省。
詳細用法能夠參考:github.com/datastructu…
另外西法我本身實現了一套 queue,我是使用鏈表實現的,理論上複雜度更好,插入和刪除時間複雜度都是 O(1),也不會有空間的浪費,核心代碼就20 行。但實際使用的話性能不必定誰好,爲何呢,你們能夠思考一下?
除了普通隊列,LeetCode 還提供了一種特殊的隊列 - 優先隊列。
// empty queue with default priority the element value itself.
const numbersQueue = new MinPriorityQueue();
// empty queue, will provide priority in .enqueue
const patientsQueue = new MinPriorityQueue();
// empty queue with priority returned from a prop of the queued object
const biddersQueue = new MaxPriorityQueue({ priority: (bid) => bid.value });
複製代碼
priority-queue 的 api 則能夠參考 github.com/datastructu…
一樣,西法也實現了堆,你們能夠參考一下。
值得一提的是,西法還實現了一些堆的高級功能,詳情參考 indexed_priority_queue
LeetCode 對 JS 的支持主要有:
_
來使用其上的功能函數。文中提到的我本身實現的數據結構代碼來自 js-algorithm-light,它是輕量級的 JavaScript 數據結構與算法庫。爲了讓使用 JS 刷題的朋友學習和使用一些經常使用的數據結構,我開闢了這個倉庫,暫定的目標是對標 Python 全部的內置數據結構和算法。
貼一下西法已經實現的數據結構。
求個一鍵三連支持一下,點贊多的話西法立馬就安排下一篇。下一次給你們分享幾個 你不知道的 LeetCode 通用小技巧。