---
# System prepended metadata

title: 'NeetCode150 練練手 : Two Sum (easy)'
tags: [刷題]

---

# NeetCode150 練練手 : Two Sum (easy)

## 前言
DC社群第一次接觸到 NeetCode
### 初次接觸
DC社群接觸 NeetCode
疑! 我只聽過 LeetCode/Codwars，這是什麼有趣東東 ?? 

### NeetCode
NeetCode 是個非常受歡迎的資源，相比 LeetCode/Codwars 題目範圍較鬆散，NeetCode 是以面試為導向，尤其是針對大公司面試時碰到的常見演算法和資料結構問題。

NeetCode 的練習題目範圍很廣，而且會將問題分門別類，並提供詳細的解法和解析，讓學習者能夠系統性地提升自己的解題能力。


### 什麼是 NeetCode150 ?? 
NeetCode150其實是就是精選 150 題，也有對應的 LeetCode題目，並且會把題目難度分類，跟類型分類讓你更可以針對各大項去練習



**分享好文**
- [刷題從 Neetcode 網站開始](https://ithelp.ithome.com.tw/m/articles/10348442)
> 那這邊也有人整理出 [NeetCode150 對應的 LeetCode](https://leetcode.com/problem-list/plakya4j/)

今天除了分享刷題外，還會分享下平常解題方式及思路，也歡迎大家一起分享喔!

## 刷題啦 ! Two Sum (easy)
:::success
題目 : [NeetCode150 : Two Sum (easy)](https://neetcode.io/problems/two-integer-sum)
:::

### 作答區

```JS
class Solution {
    /**
     * @param {number[]} nums
     * @param {number} target
     * @return {number[]}
     */
    twoSum(nums, target) {}
}
```


### 拆解解題步驟
第一次刷題可以先嘗試練習解題方式，熟悉後再進行拆解或是運用GPT協助學習各 JS 方法，這邊記錄下解題方式 : 

(一) 閱讀題目
確定參數、InputOutput 代入各參數，題目邏輯先閱讀清楚
(二) 拆解題目邏輯
拆分邏輯，去思考用何種方式邏輯解決，直到拆到程式能解決
(三) 卡關
Gpt 救救我，記得不要拿整串題目去問，拆解邏輯分批問
(四) 破解 : 參考答案
解題完參考答案並改善優化自己程式



---

#### (一) 閱讀題目 
刷題幾乎都是全英文，這時候可以運用==右鍵Google翻譯== 或是運用==Chrome插件==，這邊也推薦一個好用的插件 [沉浸式翻譯](https://chromewebstore.google.com/detail/%E6%B2%89%E6%B5%B8%E5%BC%8F%E7%BF%BB%E8%AD%AF-%E7%B6%B2%E9%A0%81%E7%BF%BB%E8%AD%AF%E5%8F%8A-pdf-%E7%BF%BB%E8%AD%AF/bpoadfkcbjbfhfodiogcnhhhpibjhbnh) 翻譯後會保留原文，也比較不會像是機翻這麼生硬

![image](https://hackmd.io/_uploads/B13EMtmCkg.png)

回到正題 
在解題前我們先需==閱讀題目==並確定==輸入input==  ==輸出output==值各代甚麼，這時候才會開始想下一步的解題邏輯。

:::warning
題目似懂非懂沒關係，看得懂Input、Output 回頭去推題目想叫我們做的事
:::

所以來看看題目要做的事 : 
- 有個函式 twoSum()
- 有兩個變數 nums 、taget 
- 要在下方作答

```js 
twoSum(nums, target){
    //作答區
}
```
接著我們來分析題目，可以看到 Input nums 是一組陣列 ，而target 是一個數字
```
Input: 
nums = [3,4,5,6], target = 7
```
```
Output: [0,1]
```
這時候可以得知 target 是 nums 其中兩個數字和，並取得他序列
下面也可以看到他有補充說明，所以透過題目就可以知道我們希望達成的程式目標

接著就可以試著拆解題目


---
#### (二) 拆解題目

這次題目是希望計算陣列 Num 其中兩數字相加 = target 並回傳序列
接著我們試著拆解題目邏輯分開處理

**主要分兩段**
一、計算數組相加 = target
二、取得序列

**拆解題目**
- 思考方法，陣列 > 聯想跑迴圈
- 陣列處理方法，for 迴圈去計算取得每個序列值，並嘗試讓他相加等於 Target

第一層先嘗試取得數列組值，也可以嘗試先帶假的數組去模擬驗證邏輯是否正確(這邊用 result 先測試)

```js
twoSum(nums, target) {
    let result = [2,3,5,7];
    for (let i = 0; i < result.length; i++) {
        console.log(result(i));
    }
    return result;
}
```
- 嘗試計算相加 = target 
因為接著要計算每個數字組合，所以就要跑到第二層迴圈，並判斷相加值
```js
 twoSum(nums, target) {
    let result = [2,3,5,7];
    for (let i = 0; i < result.length; i++) {
      for (let j = i + 1; j < result.length; j++) {
           if (result[i] + result[j] == target) {
             //i 是本來數序列，而j就是他的下一個數字 
             // result = [2,3,5,7]
            //  2+3 2+5 2+7 依此類推     
           }
       }
    }
    return result;
}
```
- 時候就可以將數組替換成正確的==nums==
- 取得相加值後就可以取得序列，==i、j==，此時就可以==push陣列== ==回傳正確序列組==

```JS
class Solution {
    /**
     * @param {number[]} nums
     * @param {number} target
     * @return {number[]}
     */

    twoSum(nums, target) {
        let result = [];
        for (let i = 0; i < nums.length; i++) {
            for (let j = i + 1; j < nums.length; j++) {
                if (nums[i] + nums[j] == target) {
                    result.push(i, j);
                }
        
            }
        }
        return result;

    }
}
```



---


#### (三) 卡關
:::danger
切記不要卡關，就直接複製題目貼上GPT，GPT會直接告訴你答案，這樣就沒有訓練邏輯意義
:::
解題卡在某思路或是不曉得用什麼方法，這時候可以將卡住地方思路在去詢問GPT，在把它整合變成你的思路，依此反覆學習訓練

EX:
- 處理陣列計算需要用到for迴圈並計算，但是我不確定接下來該如何做 ? 

```JS
twoSum(nums, target) {
    let result = [2,3,5,7];
    for (let i = 0; i < nums.length; i++) {
        console.log(result(i));
    }
    return result;
}
```
先將可能寫出來，這時候詢問 GPT ，我希望將result相加計算結果該如何做 ?
GPT 可能就會給你方向，告訴你需要再一層做計算，這時候就可以繼續往下解
```js
  twoSum(nums, target) {
    let result = [2,3,5,7];
    for (let i = 0; i < nums.length; i++) {
      for (let j = i + 1; j < nums.length; j++) {
        ///計算結果
       }
    }
    return result;
}
```

#### (四) 破解 : 參考答案
解題完先別急著關掉，這時候可以比對參考答案，優化程式碼
- 移除多餘 result 陣列 ，直接回傳
```JS
class Solution {
    /**
     * @param {number[]} nums
     * @param {number} target
     * @return {number[]}
     */

    twoSum(nums, target) {
        //let result = [];
        for (let i = 0; i < nums.length; i++) {
            for (let j = i + 1; j < nums.length; j++) {
                if (nums[i] + nums[j] == target) {
                    return [i, j];
                    //result.push(i, j);
                }
            }
        }
        //return result;
    }
}
```

- 參考他人思路
Sort 寫法
:::info
解題學習解題思路，先求有再求好，慢慢練習邏輯思路精進自己
:::
```js
class Solution {
    /**
     * @param {number[]} nums
     * @param {number} target
     * @return {number[]}
     */
    twoSum(nums, target) {
        let A = [];
        for (let i = 0; i < nums.length; i++) {
            A.push([nums[i], i]);
        }

        A.sort((a, b) => a[0] - b[0]);

        let i = 0, j = nums.length - 1;
        while (i < j) {
            let cur = A[i][0] + A[j][0];
            if (cur === target) {
                return [Math.min(A[i][1], A[j][1]), 
                        Math.max(A[i][1], A[j][1])];
            } else if (cur < target) {
                i++;
            } else {
                j--;
            }
        }
        return [];
    }
}
```

