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 特性是完全支持的,大家可以放心使用。
比如我们可以使用 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 实现的版本,代码我看过了,还是很容易看懂的。
queue
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开发、网站开发