owned this note
owned this note
Published
Linked with GitHub
# 2665.Counter II
###### tags:`Closure` | `leetCode`
<font color="#01AE9A" background="E1F3F0">`easy`</font>
## 題目
Write a function createCounter. It should accept an initial integer init. It should return an object with three functions.
The three functions are:
- increment() increases the current value by 1 and then returns it.
- decrement() reduces the current value by 1 and then returns it.
- reset() sets the current value to init and then returns it.
## Example
```javascript=
Input: init = 5, calls = ["increment","reset","decrement"]
Output: [6,5,4]
Explanation:
const counter = createCounter(5);
counter.increment(); // 6
counter.reset(); // 5
counter.decrement(); // 4
```
```javascript
Input: init = 0, calls = ["increment","increment","decrement","reset","reset"]
Output: [1,2,1,0,0]
Explanation:
const counter = createCounter(0);
counter.increment(); // 1
counter.increment(); // 2
counter.decrement(); // 1
counter.reset(); // 0
counter.reset(); // 0
```
### Constraints:
- -1000 <= init <= 1000
- total calls not to exceed 1000
---
## 解題邏輯
這題在 createCounter 這個函式裡有一個 init 的參數,以及回傳三個函式分別為`incretment`,`reset`,`decrement`,並且能夠以
```javascript=
const counter = createCounter (5)
counter.increpment()
```
的方式呼叫三個函式
### 先來第一版直覺想法
```javascript=
var createCounter = function(init) {
let allFn = {}
const increment = ()=>{
return init +1
}
const reset = ()=>{
return init
}
const decrement = ()=>{
return init -1
}
allFn.increment = increment
allFn. reset = reset
allFn.decrement= decrement
return allFn
}
```
第一版跑第一個側向是通過的
```javascript=
const counter = createCounter(5)
counter.increment();//6
counter.reset();//5
counter.decrement();//4
```
但跑第二個就壞了QQ
```javascript=
const counter = createCounter(0)
counter.increment(); // 1
counter.increment(); // 1
counter.decrement(); // -1
counter.reset(); // 0
counter.reset(); // 0
```
可以看到在第二個側向中每一次的加減法都是拿`init`這個數去加減,彼此之間沒有任何關係,但並不符合題目,題目要的是下一個函式的`init`都是接續上一個函式的結果而來的,思考後發現只要將加、減之間所引用的參數加上關聯,`reset`這個函式就是回到最初的`init`沒問題
```javascript=
var createCounter = function(init) {
let num = init
let allFn = {}
const increment = ()=>{
return num = num+1
}
const reset = ()=>{
return num = init
}
const decrement = ()=>{
return num = num-1
}
allFn.increment = increment
allFn. reset = reset
allFn.decrement= decrement
return allFn
}
```
### 將 init 賦值新變數
因此讓`increment`,`decrement`的數字來源都是同一個新變數`num`,這樣就能確保都是用同一個數字作加減,也能將結果延續了,參考解說後發現 object 的寫法可以再優化
```javascript=
var createCounter = function(init) {
let num = init
return {
increment : function(){
return num =num+1
},
reset : function() {
return num = init
},
decrement : function (){
return num=num-1
}
}
}
```
### 終極優化版
```javascript
var createCounter = function(init) {
let num = init
return {
increment : ()=>num =num+1,
reset :()=>num =init,
decrement : ()=> num=num-1
}
}
```
{%hackmd @themes/dracula %}