Jeff的隨手筆記

學習當一個前端工程師

0%

用LeetCode寫日記-Day2

這個系列是之前就有計畫要執行的,剛好在LeetCode上有看到幫我們整理好30題JS相關的題目,就決定來一個類鐵人賽的方式,把這30題做完。

因為之前沒有寫過類似文章,因此格式什麼的我都是自己亂打的,如果發現格式有改變可能是我發現更棒的格式了!

Day 2:Counter

問題描述:

Given an integer n, return a counter function. This counter function initially returns n and then returns 1 more than the previous value every subsequent time it is called (nn + 1n + 2, etc).

問題難度:Easy

問題限制:

  • 1000 <= n <= 1000
  • 0 <= calls.length <= 1000
  • calls[i] === "call"

我的解題思路

分析:

第一個反應是用閉包的概念,先設定一個外部函數,它將初始計數作為參數,並傳回一個內部函數,該函數在每次呼叫時遞增並傳回計數。

但結果出來卻是都比原本的結果多一,才發現我是已經先加1後才回傳,因此這邊做了修改:

1
2
3
4
5
6
7
var createCounter = function(n) {
let count = n - 1;
return function(n) {
count++
return count
}
};

這樣就正常了,但是先-1在加1真的覺得像白癡一樣,因此改成

1
2
3
4
5
6
7
var createCounter = function(n) {
let count = n - 1;
return function(n) {
count++
return count
}
};

其他解法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// Using arrow function
var createCounter = (n) =>{
return () => n++;
};

// Using an ES6 class
class Counter {
constructor(start) {
this.count = start;
}
next() {
return this.count++;
}
}

const counter = new Counter(10);

結語

這題使用到了閉包的概念,在一開始還知道解題的方向但十座上遇到了一點小問題,但還好都不難一下子就解決了。
閉包相關的資料可以看這篇:
https://jeff0518.github.io/2023/09/20/2023%E9%90%B5%E4%BA%BA%E8%B3%BD-2023-09-20-Day20/