LeetCode 在需要接觸演算碼的工程師中,為相當知名的練習場所。當你有需要挑戰自己的腦筋、面試前的準備……等,都滿適合來這邊看一下你的演算法和資料結構的熟悉程度。這回要筆記的有 Add Two Numbers、Generate Parentheses、Task Scheduler。
題目
2. Add Two Numbers
[連結]:https://leetcode.com/problems/add-two-numbers/
| 
					 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34  | 
						/* * 1. 給定一個新的 Node 為 0,並用 head 變數來儲存一開始的位置 * 2. 宣告一個儲存要進多少位的 carry,並開始移動 list * 3. 由於 l1,l2 的長度不會一樣,所以要分開加總。當 l1,l2 和 carry 都為 null 或 0 的時候 * 才停止 * 4. 一位一位計算,並將結果推到 list 中 * 5. 最後的結果會像是 "0"12345......,所以要取 head.next 以後的結果才對 */ var addTwoNumbers = function(l1, l2) {     let list = new ListNode(0)     const head = list     let carry = 0     while(l1 || l2 || carry>0){         let sum = 0         if(l1 !== null){             sum += l1.val             l1 = l1.next         }         if(l2 !== null){             sum += l2.val             l2 = l2.next         }         sum += carry         list.next = new ListNode(sum % 10)         carry = parseInt(sum / 10)         list = list.next     }     return head.next };  | 
					
22. Generate Parentheses
[連結]:https://leetcode.com/problems/generate-parentheses/
| 
					 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28  | 
						/**  * 重複呼叫的經典題,當左括號的剩餘數量大於右括號,那就繼續添加左括號直到等於 n  */ /**  * @param {number} n  * @return {string[]}  */ var generateParenthesis = function(n) {     let result = []     generateStr(n,n,"",result)     return result }; function generateStr(leftCount,rightCount,str,result){     if(leftCount>rightCount) return;     if(leftCount === 0 && rightCount === 0){         result.push(str)     }else{         if(leftCount > 0){             generateStr(leftCount-1,rightCount,str+"(",result)         }         if(rightCount > 0){             generateStr(leftCount,rightCount-1,str+")",result)         }     } }  | 
					
621. Task Scheduler
[連結]:https://leetcode.com/problems/task-scheduler/
| 
					 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18  | 
						/**  * 1. 若 n 為 0,則回傳 tasks 的長度就好  * 2. 先取得每個文字的出現頻率、再找出頻率最大值  * 3. 兩兩相同 task 的間隔為 n+1 ,會出現 頻率最大值-1 次  * 4. 不完整的末端長度,可由滿足頻率最大值的個數來決定  */ var leastInterval = function(tasks, n) {     if(n===0) return tasks.length     const frequencyMap = tasks.reduce((pre,next)=>{         pre[next] = pre[next] + 1 || 1         return pre        }     ,{})     const maxFrequency = Math.max(...Object.values(frequencyMap))     const lastRowLength = Object.values(frequencyMap).filter(d=>d===maxFrequency).length     return Math.max(tasks.length, (maxFrequency-1) * (n+1) + lastRowLength) };  | 
					

