首頁 > web前端 > js教程 > 歷史學家歇斯底里

歷史學家歇斯底里

Mary-Kate Olsen
發布: 2024-12-08 10:38:13
原創
711 人瀏覽過

Historian Hysteria

代碼來臨 2024 年第 1 天

第 1 部分

壘球以微笑開啟新的一年

解決這個問題看起來很簡單:

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
登入後複製
登入後複製

第 1 步:製作兩個數字列表

首先,我將建立一個包含 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

它對我的拼圖輸入有效嗎?

確實如此!

哇!一顆金星!

第2部分

測試運行時間的有趣轉折

說明讓我相信:

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中文網其他相關文章!

來源:dev.to
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板