解決這個問題看起來很簡單:
Parse the input into two equal lists of numbers Sort each list in ascending order Compare both values at each index Determine the absolute value after calculating the difference Increment a tally by the absolute value
首先,我將建立一個包含 2 項的列表,其中每個項目都是一個數字:
input.split('\n').split(' ').map(Number)
然後,我將根據索引將項目提取到單獨的列表中:
let [list1, list2] = [ input.map((_,i) => i == 0), input.map((_,i) => i == 1) ]
第一個錯誤:連結分割。
我無法對數組呼叫 split。
我必須在迭代方法中進行拆分,例如 map:
input.split("\n").map(...);
第二個錯誤:空間不足。
輸入的每個數字之間包含多個空格,而不是一個:
input.split("\n").map((el) => el.split(" ").map(Number));
第三個錯誤:過度考慮清單存取。
我的程式碼就像每個巢狀列表都是一個元素一樣,並根據該元素是列表中的第一個還是第二個元素返回布林值。
什麼? ? ? ! ! !
此程式碼可識別每個清單並保留第一個或第二個項目:
let [list1, list2] = [ input.map(list => list[0]), input.map(list => list[1]), ];
唉,我的演算法現在產生兩個數字列表!
哇,十個月沒做這些了,我有點生疏了。
這應該是簡短而甜蜜的。
事實上,我將直接附加到上面的程式碼:
let [list1, list2] = [ input.map(list => list[0]).sort((a,b) => a - b), input.map(list => list[1]).sort((a,b) => a - b), ];
在範例輸入中發揮作用:
[ 1, 2, 3, 3, 3, 4 ] [ 3, 3, 3, 4, 5, 9 ]
let answer = 0; for (let i = 0; i < list1.length; i++) { answer += Math.abs(list1[i] - list2[i]); }
它適用於範例:11
它對我的拼圖輸入有效嗎?
確實如此!
哇!一顆金星!
說明讓我相信:
For each number in list 1 For each number in list 2 If there's a match Increment a tally by 1
這表示清單 2 將被檢查清單 2 長度乘以清單 1 長度...次。
每項 1000 件:100 萬張支票
這還不錯。但這似乎沒有必要。
我關心的是清單 2 中每個數字的計數。
所以,我可以檢查所有 1000 個數字一次,並建立一個數字到其計數的地圖。然後,檢查該清單 1000 次。
2000 << 100萬
我比較喜歡這種方法。到程式碼!
範例列表如下:
4, 3, 5, 3, 9, 3
所以我想要一個看起來像這樣的物件:
{ 4: 1, 3: 3, 5: 1, 9: 1 }
使用第 1 部分演算法中的 list2,我需要執行歸約來建構此物件:
let counts = list2.reduce((obj, num) => { if (!(num in obj)) { obj[num] = 1 } else { obj[num] += 1 } return obj }, {})
令我驚訝的是,該片段的效果與預期完全一致!
我以為我忘了 obj 中 num 的正確語法,但就是這樣!
另一個帶有條件檢查與數字關聯的存在和值的歸約:
Parse the input into two equal lists of numbers Sort each list in ascending order Compare both values at each index Determine the absolute value after calculating the difference Increment a tally by the absolute value
我一直看到錯誤的分數。
我一直想知道為什麼。
我不斷添加 console.log() 語句,並包含越來越多的要列印的值。
我不斷看到意想不到的數值。
然後,我看到了。
我正在與 list2 進行比較,而不是與我的自訂計數物件進行比較!
對自我的巨大打擊。但這正是我第一天所需要的。
這是工作代碼:
input.split('\n').split(' ').map(Number)
這將為範例輸入產生正確的答案。
希望它對我的拼圖輸入也能起到同樣的作用。
希望它運行得快如閃電!
確實如此!
耶哈www!!!
兩顆金星拉開序幕。
以及一些讓我腳踏實地的初學者錯誤。
這就是我喜歡這些謎題的原因。
隔天也繼續!
以上是歷史學家歇斯底里的詳細內容。更多資訊請關注PHP中文網其他相關文章!