# 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 []; } } ```