# 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) 翻譯後會保留原文,也比較不會像是機翻這麼生硬

回到正題
在解題前我們先需==閱讀題目==並確定==輸入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 [];
}
}
```