這幾天接受了白板題的小測驗,解了一道題,其中提出這題測驗題的大大也分享了他的解法,回到家後,自己也嘗試了一下他給的更好的解法,這邊也來稍微紀錄一下。
首先,一樣先看題目內容題目需求從陣列中取出加總起來的合可以等於第二個參數的兩個數字,並返回它們在陣列中的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)

許久未寫LeetCode刷題筆記了,趁著這次參加一個小考試的機會,來自己回顧檢討一下自己的寫的這道題。
看一下題目內容
題目需求要將陣列中的數字0全部都排到陣列最後面。解題過程我總共想了兩個方向的作法:第一個方向 - 用一個pointer + 迴圈來檢查是不是0,並且進行splice和push的動作。用while迴圈逐一去比對陣列每個數字,當發現是0的時候,就把這個數字拿出來往後放。但是!!又把它拿出來檢討後,才發現這麼做其實會有一個問題!!(思慮不周的我,還以為這樣就完美完成,然後就這樣把答案交出去了QQ)
發現到的問題是「因為陣列的排序有變動,如果在這個狀況下跑迴圈,會有漏檢查的數字。」
例如:
目標排序陣列為[0, 0, 1, 0]
index會在第一次排成[0, 1, 0, 0]後,被+1,但是這樣就檢查不到原本index為1的數字,如果原本index為1的數字又剛好是0的話,就無法達成這題的需求。
為了解決這個問題,我又改了一個寫法。但是!!又發現一個問題,這個做法會造成太多多餘的迴圈檢查步驟,讓時間限制超過。第二個方向 - 用insertion sort(有兩個pointer)的方式進行排序。因為上面的方向都沒有找到比較完美的解法,所以就又回頭去複習一下之前學的演算法內容,找到了一個比較合適的方法「insertion sort」,整體的實作方向用文字來解釋的話,就是「往後找出不等於0的數字,與數字0交換位置」。
每個小步驟的說明
1. 準備兩個pointer(我這邊命名為leftIndex和rightIndex),兩個都是從陣列的index 0為起點。
2. 一開始pointer還在相同起點時,如果指到的數字為0,rightIndex會被+1,目的是繼續往後查找不為0的數字;如果數字不為0的話,就存下rightIndex的數字,與leftIndex的數字做交換,目的是將不為0的數字往前排,排定過後需要把rightIndex和leftIndex都+1,目的是要能繼續往後檢查還沒排定的數字。
3. 整體步驟以迴圈來進行,當rightIndex等於array長度就不要再繼續做檢查的動作,也代表每個數字都檢查過一次了。完整程式碼內容
方向二初版方向二優化版文科少女寫程式 發表在 痞客邦 留言(0) 人氣(71)
這次是找出醜陋數的題目題目需求:
若質因數為2、3、5,則此數字為質因數,如果可以被其他數字整除,則不為醜陋數,但是1為醜陋數(回傳true或false)。
解題過程:
1. 先排除小於1的數字,因為負數和0都不為我們所說的醜陋數。
2. 接著因為1為true,所以也把1的判斷獨立寫出來。
2. 分三個區塊確認,用%分別針對2、3、5取餘數,如果不等於0就一定是false。(迴圈條件設定大於2、3、5的數字)
=>由於分三個部分,用迴圈檢查,當可以被3除,但卻不能被2除的數字出來的話,會直接顯示false,
所以這裡只需要確認是否可以被這三個數字整除就好,每一個數字的餘數確認都不用馬上回傳false,
而是用break跳出迴圈進行下一個數字的餘數檢查。
3. 如果第一次可以被整除,不代表一定可以繼續被整除下去,所以進行除2、3、5的動作,直到數字被除到變最小
4. 不管在取餘數階段就被判斷不是醜陋數而被用break強制跳出迴圈的數字,還是被除到最小後結束迴圈的數字,
都會在最後面再透過%檢查一次,結果的true&false會從這個部分判斷並傳出
程式碼內容:文科少女寫程式 發表在 痞客邦 留言(0) 人氣(147)
這次打算寫自己的LeetCode刷題記錄,主要是為了要留下自己的解題過程,
因為文科少女除了是文科腦以外,還是金魚腦XDD
不過由於只是自己的解題過程紀錄,所以不會是最高超的解題方式,
反而會偏向於比較容易懂的方式!
這次先來記錄一下,自己最不擅長的數學題QQ

題目需求:
n為任意數字,判斷n是否為2的次方(回傳true或false)。
解題過程:
1. 先排除小於1的數字,因為負數和0都不等於2的2次方。
2. 1雖然用2除不盡,但是2的0次方為1,所以如果n等於1,一定會先回傳true。
3. 接著讓我們從2開始判斷,把不是2的次方數的數字都挑出來,並回傳false。
4. 2一定是2的次方,所以在條件設定上,直接用n>2下去設定。
5. 在大於2的數字中,如果無法被2除盡,一定就不是2的次方數,所以一定要被挑出來回傳false。
=>看是否能被2除盡的部分利用算術運算子%,若n%2 不等於0,就代表除不盡。
6. 有些數字則是在第一次除以2時,可以被除盡,但是第二次開始就無法被2除盡,
代表這個數字不是純粹被2組成的數字a。
=>這種數字也就不是2的次方。
7.數字第一次用%看是否可以被除盡後,若可以除盡,再除2一次,看被除2後,是否還可以被2整除,以確認這個數字不是真的是2的次元。
8. 最終被這個過程過濾掉的數字,就會是2的次方。
程式碼內容:

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