這幾天接受了白板題的小測驗,解了一道題,其中提出這題測驗題的大大也分享了他的解法,回到家後,自己也嘗試了一下他給的更好的解法,這邊也來稍微紀錄一下。

首先,一樣先看題目內容


題目需求
從陣列中取出加總起來的合可以等於第二個參數的兩個數字,並返回它們在陣列中的index。

解題過程
在現場我想到的方向如下:
第一個方向 - 先排序陣列,讓他可以從小至大排列,用兩個個pointer,一個從頭開始移動,一個從尾開始移動+ 迴圈來檢查哪兩個數字的總合等於第二個參數。


但是!!回家重新復盤檢討後,才發現這麼做並不是正解!!
發現到的問題是「因為我有重新排序,所以出來的index會是錯的。」
雖然這個做法的確可以找出可以加總出正解的兩個數字,但是最終回傳的index並不是正確的。

我自己檢討的時候還有針對這個方向做修改,修改方式就是複製出一個陣列做排序。


但是!!這樣做還是有問題,因為如果陣列內對應到正確整合的兩個數字是同一個數字的話,用indexOf回找數字的index只會找到排序第一的數字,也就無法return出正確的答案。

第二個方向 - 不做排序,透過數字差下去找另一個數字的位置。
這個方式是當天出題大大給我一些小提示後,又想到的方式,但是因為一樣有用indexOf去找數字的index,所以一樣會有方向一檢討後調整解法的問題。

第三個方向 - 效率比較差的雙迴圈的方式。
這是另一個我自己在家檢討的時候,想到的方式。雖然因為跑了兩個迴圈,時間複雜度變成O(n^2)了,整體效率比較差,但至少有先達成這道題的目標答案。

外圈從頭開始跑迴圈到倒數第二個數字,內圈從第二個數字跑到最後一個數字。

第四個方向 - 只跑一次迴圈,並且用查找效率較好的物件儲存扣掉當前遍歷到數字後,還剩餘多少的數字和當前遍歷到的數字index。
詳細把程式碼實作出來後,只需要跑一個迴圈,整體效率比較好,且可以達到這題需求的解法其實還是當天出題大大最後提點我的解法。
這裡也將完整的程式碼實作出來如下:

每個小步驟的說明
1. 準備一個拿來存[target - 當前遍歷數字]剩餘數值和當前遍歷數字index的空物件。
2. 跑一個for迴圈,每跑一次都會去計算遍歷到的當前數值還差多少可以達到target數字。
3. 如果temp裡面沒有對應到的剩餘數值的話,意即如果去查找temp物件,返回undefined的話,就把當前數字差多少的數值和當前數字的index放進temp物件裡面。
4. 如果從temp中查有查找到對應的剩餘數值,而且存儲數字的index和當前跑到的數字index不相同的話(因為不能自己跟自己加總),就返回自己的index,儲存當時數字的index。


這樣就完成了!感謝那位大大當天最後的提點,讓我學到一個很不錯的解法。


 

文章標籤
全站熱搜
創作者介紹
創作者 文科少女寫程式 的頭像
文科少女寫程式

文科少女學程式

文科少女寫程式 發表在 痞客邦 留言(0) 人氣(40)