体育科出身の僕がLeetCode入門してみた - Day4 2665. Counter II

# 概要
文系（体育科）卒業の僕が、人並みのアルゴリズムを身につけるためにLeetCodeを初めてみました。
日本だとAtCoderが一般的なようですが、海外エンジニアへの憧れを持つ僕はLeetCodeを選びました。

フロントの言語しかほぼ触ったことがないのでJavaScriptでやっていこうと思います。

# 問題
[2665. Counter II](https://leetcode.com/problems/counter-ii/description/?envType=study-plan-v2&envId=30-days-of-javascript)

問題文
> Write a function createCounter. It should accept an initial integer init. It should return an object with three functions.<br>
The three functions are:<br>
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.

初期コード
```javascript
/**
 * @param {integer} init
 * @return { increment: Function, decrement: Function, reset: Function }
 */
var createCounter = function(init) {
    
};
```
問題を整理すると...
- `createCounter`関数の作成
    - 3つ関数を持つ`Object`を`return`する
        - `increment()`
            - `current value`に対して1ずつ増える
        - `decrement()`
            - `current value`に対して1ずつ減る
        - `reset()`
            - `current value`を初期値に戻して、初期値を`return`する

![CleanShot 2024-06-27 at 05.40.03@2x.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/592040/328ea11f-3480-e970-8976-c329f837ba39.jpeg)
とあるので、連続して関数を実行したときに前の値が引き継がれているらしい。
なので下記のように書いてみました。
```javascript
var createCounter = function(init) {
   return {
       increment(){
            currentValue = init++
            return currentValue;
       },

       decrement(){
            currentValue = init--
            return currentValue;
       },

       reset(){
            currentValue = init;
            return currentValue;
       }
   } 
};

```
ダメみたいです。
![CleanShot 2024-06-27 at 05.41.11@2x.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/592040/2f88f335-ec8a-9107-7e99-d5f62ef01499.jpeg)

そもそも+されていない。`init++`の書き方が良くないのかな？
ということでMDNを見てみます。

https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Operators/Increment

やっぱりここに原因がありそうです🤔
```javascript
x++;
++x;
```

> オペランドに後置で演算子を付けると (例えば、 x++) 、インクリメント演算子はインクリメントしますが、インクリメント前の値を返します。<br>
オペランドに前置で演算子を付けると (例えば、 ++x) 、インクリメント演算子はインクリメントし、インクリメント後の値を返します。

「へぇ」

なので5が`currentValue`にセットされていたのか。
ということは前置で演算子をつければ良さそうですね。

```javascript
var createCounter = function(init) {
   return {
       increment(){
            currentValue = ++init
            return currentValue;
       },

       decrement(){
            currentValue = --init
            return currentValue;
       },

       reset(){
            currentValue = init;
            return currentValue;
       }
   } 
};
```
ダメみたいです。
![CleanShot 2024-06-27 at 05.47.29@2x.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/592040/8135e570-1081-703d-1cc0-5dc6704a6ea9.jpeg)

`init`をそのまま使っているのが良くないのかな？`init`が書き変わらないように下記のようにしてみます。

```javascript
var createCounter = function(init) {
    let currentValue = init;

   return {
       increment(){
            currentValue += 1;
            return currentValue;
       },

       decrement(){
            currentValue -= 1;
            return currentValue;
       },

       reset(){
            currentValue = init;
            return currentValue;
       }
   } 
};

```

https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Operators/Addition_assignment

いけた🎉

今日も今日とて力尽きたのでコードの最適化など気にせず提出します。

![CleanShot 2024-06-27 at 06.01.03@2x.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/592040/0feb7d17-baeb-dd27-1447-2288d106572c.jpeg)

（いいスコアで草）