leetcode javascript 30 days
沒在 leetcode 寫過 js 耶,酷
2667. Create Hello World Function
- 了解 closure 的概念就好
1 |
|
2620. Counter
- 一樣 closure,之後 call return 的 function 都可以修改最初傳進來的變數的值
1 |
|
2704. To Be Or Not To Be
- 這題是寫測試 code,教我們怎麼 throw error
1 |
|
2665. Counter II
1 |
|
2635. Apply Transform Over Each Element in Array
實作 map 來跑 input function,題目規定不能用
Array.map
讓我愣了一下
有各種不同的寫法
for loop
1
2
3
4
5
6
7
8
9
10/**
* @param {number[]} arr
* @param {Function} fn
* @return {number[]}
*/
var map = function (arr, fn) {
const ret = [];
for (let i = 0; i < arr.length; i++) ret.push(fn(arr[i], i));
return ret;
};js 可以不用
push
,會自動填充1
2
3
4
5var map = function (arr, fn) {
const ret = [];
for (let i = 0; i < arr.length; i++) ret[i] = fn(arr[i], i);
return ret;
};補充
如果中間有空的沒填,比方說
1
2
3const arr = [];
arr[0] = 0;
arr[2] = 2;那麼
arr[1]
會自動填成undefined
,因此arr.length
會是3
array
可以用const
是因為在 javascript 中,const
是 保證變數本身的記憶體位置不變,但不保證內部內容不可變,因此在陣列 arr reference 不變的情況下改內容是可以接受的
forEach
1
2
3
4
5var map = function (arr, fn) {
const ret = [];
arr.forEach((el, idx) => (ret[idx] = fn(el, idx)));
return ret;
};forEach
沒有回傳值,不能像map
那樣直接return
array.reduce
,但不太直觀array.reduce(callback, initialValue);
1
2
3
4
5
6var map = function (arr, fn) {
return arr.reduce((ret, el, idx) => {
ret[idx] = fn(el, idx);
return ret;
}, []);
};如果可以用
Array.map
1
var map = (arr, fn) => arr.map(fn);
健康又快樂
2634. Filter Elements from Array
跟前一題類似
forEach
1
2
3
4
5
6
7
8
9
10/**
* @param {number[]} arr
* @param {Function} fn
* @return {number[]}
*/
var filter = function (arr, fn) {
const ret = [];
arr.forEach((el, idx) => fn(el, idx) && ret.push(el));
return ret;
};如果可以用
Array.filter
1
var filter = (arr, fn) => arr.filter(fn);
2626. Array Reduce Transformation
跟前幾題類似
forEach
1
2
3
4
5
6
7
8
9
10
11/**
* @param {number[]} nums
* @param {Function} fn
* @param {number} init
* @return {number}
*/
var reduce = function (nums, fn, init) {
let acc = init;
nums.forEach((el) => (acc = fn(acc, el)));
return acc;
};如果可以用
Array.reduce
1
var reduce = (nums, fn, init) => nums.reduce(fn, init);
2629. Function Composition
從最後面開始每個 function 跑一次
1 |
|
reduceRight
跟array.reduce()
一樣,只是是從最右邊往左 reduce1
2
3var compose = function (functions) {
return (x) => functions.reduceRight((acc, fn) => fn(acc), x);
};
2703. Return Length of Arguments Passed
好像只是在考 javascript 的 rest parameter?
1 |
|
2666. Allow One Function Call
closure + rest parameter
1 |
|
2623. Memoize
Map
- 在 javascript 中,
Map
不能用中括號來存取,一定要Map.get()
、Map.set()
、Map.has()
。另外這題可以用JSON.stringif()
把args
變成key
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24/**
* @param {Function} fn
* @return {Function}
*/
function memoize(fn) {
const hash = new Map();
return function (...args) {
const key = JSON.stringify(args);
if (hash.has(key)) return hash.get(key);
hash.set(key, fn(...args));
return hash.get(key);
};
}
/**
* let callCount = 0;
* const memoizedFn = memoize(function (a, b) {
* callCount += 1;
* return a + b;
* })
* memoizedFn(2, 3) // 5
* memoizedFn(2, 3) // 5
* console.log(callCount) // 1
*/- 在 javascript 中,
Object
Object
就比較靈活
1
2
3
4
5
6
7
8
9
10
11
12
13/**
* @param {Function} fn
* @return {Function}
*/
function memoize(fn) {
const hash = {};
return function (...args) {
const key = JSON.stringify(args);
if (hash[key] != undefined) return hash[key];
hash[key] = fn(...args);
return hash[key];
};
}
2723. Add Two Promises
這邊要用 Promise.all
來等所有 promise
算好一起跑 then
。
直接加
- 因為這裡 arg 只有兩個數字,可以直接加起來就好
1
2
3
4
5
6
7
8
9
10
11
12
13/**
* @param {Promise} promise1
* @param {Promise} promise2
* @return {Promise}
*/
var addTwoPromises = async function (promise1, promise2) {
return Promise.all([promise1, promise2]).then(([a, b]) => a + b);
};
/**
* addTwoPromises(Promise.resolve(2), Promise.resolve(2))
* .then(console.log); // 4
*/當 arguments 不只兩個時,可以用
Array.reduce()
1
2
3
4
5var addTwoPromises = async function (...args) {
return Promise.all(args).then((ret) =>
ret.reduce((acc, val) => acc + val, 0)
);
};
2621. Sleep
resolve()
是 Promise 提供的 function,用來把 Promise 的狀態變成已完成。所以這邊在millis
時間後執行resolve()
就能完成return
。
1 |
|
2715. Timeout Cancellation
滿酷的題目,很有趣
1 |
|
2725. Interval Cancellation
跟上一題差不多,但要先馬上 call fn 一次
1 |
|
2637. Promise Time Limit
Promise.race()
會遍歷傳進來的一堆 Promise
,然後回傳最先執行完的那個。
1 |
|
2622. Cache With Time Limit
在 js 中,用 Function.prototype
的方式可以宣告這個物件裡面包含的函式,像這題就宣告了 get
、set
、count
1 |
|
2627. Debounce
- 沒什麼特別的
1 |
|
2721. Execute Asynchronous Functions in Parallel
好難阿,題目規定不能用 Promise.all
,要注意回傳的順序,還要確保所有 Promise
已經做完。
1 |
|
- 如果可以用
Promise.all
1
var promiseAll = (functions) => Promise.all(functions.map((fn) => fn()));
2727. Is Object Empty
一開始最直覺的方法,直接轉成 Array
算 length
,Array
也是 Object
的一種,所以不用管 obj
是不是 Array
1 |
|
更簡單的方法
1 |
|
2677. Chunk Array
我只會這種醜醜 code qq
1 |
|
更簡潔的寫法
Array.slice()
會回傳一個新的陣列,不會改變原本的陣列
1
2
3
4
5let chunk = function (arr, size) {
let ret = [];
for (let i = 0; i < arr.length; i += size) ret.push(arr.slice(i, i + size));
return ret;
};arr.slice
會回傳[i, i+size)
的陣列,不用擔心i+size
超過arr.length
的問題,因為slice
會自動調整
2619. Array Prototype Last
this[this.length - 1]
也可以改成像 Python 那樣, this.at(-1)
1 |
|
2631. Group By
不知道為什麼是 medium
1 |
|
2724. Sort By
javascript 中,lambda function 可以直接寫在 Array.sort()
裡面
1 |
|
不過 arr.sort()
會改變原本的 input array,實際上應該要複製一份才對
1 |
|
2722. Join Two Arrays by ID
有點麻煩的題目
1 |
|
別人精簡的做法,結合我的 ret
和 id_idx_map
,最後用 Object.values()
的時候會自動根據 key
做 sort
1 |
|
2625. Flatten Deeply Nested Array
DFS 陣列裡面的每一層
1 |
|
也可以簡化成下面這樣,本質上是一樣的
1 |
|