# 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 %}
{"metaMigratedAt":"2023-06-18T03:33:24.110Z","metaMigratedFrom":"Content","title":"2665.Counter II","breaks":true,"contributors":"[{\"id\":\"da4833e9-8c75-4c4a-9870-e972056b78eb\",\"add\":3198,\"del\":138}]"}
Expand menu