天天看點

你不知道的 LeetCode 技巧(第一篇)

tip1 - ES6+

首先穿插一個小知識:我們送出的 JS 是如何被 LeetCode 執行的?

我們在力扣送出的代碼是放到力扣背景運作的, 而 JS 代碼在力扣背景是在 node 中以 --harmony 方式運作的。

大概是這樣:

node --harmony  index.js           

其中 index.js 就是你送出的代碼。

比如:

// 前面 LeetCode 會添加一些代碼
function sum(a, b) {
  // you code
}

// 這裡是 LeetCode 的測試用例
expect(sum(1, 2)).toBe(3);
expect(sum(1, 8)).toBe(9); // 如果測試用例不通過,則直接抛出錯誤給前端           

是以 ES6 特性是完全支援的,大家可以放心使用。

你不知道的 LeetCode 技巧(第一篇)

比如我們可以使用 ES6 的解構文法完成數組兩個值的交換。

[a, b] = [b, a];

如下就是使用了 ES6 的數組解構文法,更多 ES6+ 請參考相關文檔。

tip2 - lodash

在 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]           

tip3 - queue & priority-queue

為了彌補 JS 内置資料結構的缺失。除了 JS 内置資料結構之外,LeetCode 平台還對 JS 提供了兩種額外的資料結構,它們分别是:

queue

priority-queue

這兩個資料結構都使用的是第三方 datastructures-js 實作的版本,代碼我看過了,還是很容易看懂的。

LeetCode 提供了 JS 對隊列的支援。

// empty queue
const queue = new Queue();

// from an array
const queue = new Queue([1, 2, 3]);           

其中 queue 的實作也是使用數組模拟。不過不是直接使用 shift 來删除頭部元素,因為直接使用 shift 删除最壞情況時間複雜度是 $O(n)$。這裡它使用了一種标記技巧,即每次删除頭部元素并不是真的移除,而是标記其已經被移除。

這種做法時間複雜度可以降低到 $O(1)$。隻不過如果不停入隊和出隊,空間複雜度會很高,因為會保留所有的已經出隊的元素。是以它會在每次出隊超過一半的時候執行一次縮容(類似于數組擴容)。這樣時間複雜度會增大到 $O(logn)$,但是空間會省。

如果你想開發小程式或者app的話,可以通過第三方專業開發平台,來幫助你實作開發需求:

廈門在乎科技

-專注

廈門小程式開發

、app開發、網站開發

繼續閱讀