Re: [閒聊] 每日LeetCode

看板Marginalman作者 (動物園 公告)時間2年前 (2023/11/11 00:34), 編輯推噓2(201)
留言3則, 3人參與, 2年前最新討論串503/719 (看更多)
※ 引述《Rushia (みけねこ的鼻屎)》之銘言: : https://leetcode.com/problems/restore-the-array-from-adjacent-pairs/description : 1743. Restore the Array From Adjacent Pairs : 有一堆整數儲存在一個陣列包含了 n 個不相同元素,你忘記陣列長什麼樣子了但是 : 你記得所有數字的旁邊有哪些數字,給你一個二維陣列adjacentPairs ,adjacentPairs : [i] = [ui, vi] 表示兩個數字 ui 和 vi 在陣列裡面相鄰,求出原本的陣列長什麼樣子 : ,如果有多種結果返回任意一種即可。 基本思路差不多 Intuition 定義一個類似double link list結構的類別 然後把每個邊雙方連起來從頭找到尾 Approach 我們知道每個元素相鄰的元素 而且每個元素最多只會有兩個相鄰的元素 頭尾則各只有一個 所以我們定義下面這個類別 interface DoubleLinkList { value: number prevNode?: DoubleLinkList nextNode?: DoubleLinkList } 就可以把所有元素的相鄰狀況記錄下來 但是單純紀錄完去找會遇到兩個問題: 1.我們只知道相鄰狀況,但是不知道頭尾 2.每個元素的next不一定是下一個,有可能會跑回來,例如下面的狀況: { value: 1, prevNode: undefined, nextNode: 2} { value: 2, prevNode: 3, nextNode: 1} 1找到2之後又找回1,然後就會陷入無限迴圈。 對於上面的第一個問題的解法 我們可以透過元素出現的次數去找頭尾 如果只有出現一次的就是頭尾 原本我用陣列去紀錄 後來發現元素可能是負數 所以改成用Map去紀錄 至於第二個問題的解法 我們一般會認為可以直接交換prev跟next去保持鏈結的正確性 但是這樣太麻煩沒有必要 我們的雙向鏈結用完一次就會丟掉 所以我們採用第二個方法 就是記錄他的前一個元素 如果prev就是前一個元素我們就用next 反之我們就用prev 最後從頭到尾跑一次輸出答案 完工 TS Code: interface DoubleLinkList { value: number prevNode?: DoubleLinkList nextNode?: DoubleLinkList } function restoreArray (adjacentPairs: number[][]): number[] { const count = new Map<number, number>() const map = new Map<number, DoubleLinkList>() const GetNode = (index: number): DoubleLinkList => { if (map.has(index)) return map.get(index) const node: DoubleLinkList = { value: index } map.set(index, node) return node } const ConnectTo = (node1: DoubleLinkList, node2: DoubleLinkList): void => { if (node1.prevNode === undefined) node1.prevNode = node2 else node1.nextNode = node2 } const connectNode = (node1: DoubleLinkList, node2: DoubleLinkList): void => { ConnectTo(node1, node2) ConnectTo(node2, node1) } const addCount = (index: number): void => { count.set(index, (count.get(index) ?? 0) + 1) } for (let i = 0; i < adjacentPairs.length; i++) { const index0 = adjacentPairs[i][0] const index1 = adjacentPairs[i][1] connectNode(GetNode(index0), GetNode(index1)) addCount(index0) addCount(index1) } let head: number = -1 for (const key of count.keys()) { if (count.get(key) === 1) { head = key break } } const answer: number[] = [] let lastNumber = 0.1 let node = map.get(head) const getNextNode = (node: DoubleLinkList, lastNumber): DoubleLinkList => { if (node.prevNode?.value === lastNumber) return node.nextNode return node.prevNode } while (node !== undefined) { answer.push(node.value) const tNumber = node.value node = getNextNode(node, lastNumber) lastNumber = tNumber } return answer } -- Zoosewu Yoututbe顯示PTT推文 可以在各個網站追實況或Live時使用 預覽圖: https://i.imgur.com/ZhtXdAJ.png
https://i.imgur.com/WqbLNV3.png
完整介紹: https://github.com/zoosewu/PTTChatOnYoutube/tree/master/homepage 支援的網站: Youtube Twitch Holotools Niji-mado Holodex -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 114.32.229.33 (臺灣) ※ 文章網址: https://www.ptt.cc/bbs/Marginalman/M.1699634067.A.60C.html

11/11 00:34, 2年前 , 1F
這題我明天應該會想要再寫一次 我想用FP試試看
11/11 00:34, 1F

11/11 00:41, 2年前 , 2F
你好強 大師
11/11 00:41, 2F

11/11 00:45, 2年前 , 3F
動物園 極端光譜 快看
11/11 00:45, 3F
文章代碼(AID): #1bJbkJOC (Marginalman)
討論串 (同標題文章)
文章代碼(AID): #1bJbkJOC (Marginalman)