面試實戰:找出陣列中出現頻率最高的k個元素 (JavaScript實作與解題思路)

更新於 發佈於 閱讀時間約 5 分鐘

軟體工程師職涯升級計畫啟動!立即預約職涯諮詢、履歷健檢或模擬面試👈,為您的加薪做好準備!

這裡我們來實際模擬一段面試實戰對話,讓你看看整個流程會怎麼進行。


🤵 面試官說明題目:

給你一個整數陣列 nums 和一個整數 k,請你回傳其中出現頻率最高的 k 個元素

時間複雜度須優於 O(n log n)。

👨‍💻 面試者第一步:確認理解與釐清問題

我會先回應:

「如果我理解正確,我需要找出陣列中最常出現的前 k 個數字,並回傳它們的值。請問有沒有可能有多個數字出現次數一樣?如果有,回傳任意 k 個都可以嗎?」

👨‍🏫 面試官回覆:

是的,有可能出現頻率一樣的情況,回傳任意 k 個都可以。

💡 思路發想與討論

我會先 verbalize 我的思路:

「我打算分兩步驟來解這題:

  1. 使用 Map 計算每個數字的出現次數
  2. 使用最小堆(Min Heap)來維持目前出現次數最多的 k 個元素。
    因為堆可以保證插入與刪除的操作都是 O(log k),整體時間複雜度為 O(n log k),符合題目要求。」

💬 思路補充與選項比較

「另外一種方式是用 Bucket Sort,我可以用出現次數作為 index 建一個 bucket array,最後從尾巴往前數 k 個結果。不過這方式空間開銷較大,且實作較繁瑣,我會先實作 heap 解法。」


🔧 程式碼實作(JavaScript 範例)

javascript
複製編輯function topKFrequent(nums, k) {
const freqMap = new Map();

// 統計每個數字出現的次數
for (let num of nums) {
freqMap.set(num, (freqMap.get(num) || 0) + 1);
}

// 使用最小堆(這裡用陣列模擬,實際面試可說明 Heap 結構)
const heap = [];

for (let [num, freq] of freqMap.entries()) {
heap.push([freq, num]);
heap.sort((a, b) => a[0] - b[0]); // 最小堆,根據頻率排序

if (heap.length > k) {
heap.shift(); // 移除最小的
}
}

// 回傳 top k 項的元素值
return heap.map(([_, num]) => num);
}

🧪 測試案例驗證

javascript
複製編輯console.log(topKFrequent([1,1,1,2,2,3], 2)); // 輸出 [1,2]
console.log(topKFrequent([1], 1)); // 輸出 [1]

📊 複雜度分析

  • 時間複雜度
    • 建立頻率表:O(n)
    • 維護最小堆:O(n log k)
    • 總共:O(n log k)
  • 空間複雜度
    • Map 與 Heap 使用了額外空間:O(n)

🗣 模擬講解與溝通技巧

面試時講解重點:

「我選擇使用最小堆維持 top k 項。每次將新項目放入堆中,如果超出 k 個,我就移除出現頻率最少的。這樣可以確保最後留下的就是出現頻率最高的 k 個數字。」

萬一堆實作卡住了,你可以說:

「實作細節上我可以使用 PriorityQueue 或內建堆結構,這裡用 array 簡化模擬,重點是思路與操作順序。」


✅ 模擬面試總結

這題涵蓋了常見技巧:

  • 哈希表記錄頻率
  • 堆維護排序條件
  • 時間複雜度優化

也是很多大公司(如 Google、Amazon、Meta)非常愛考的題型。練熟這類問題,面試過關的機率將大幅提升!


📌 想看更多 LeetCode 模擬面試題目與解法?

💬 歡迎留言告訴我你想練哪一類型題目(Array、Graph、String、Dynamic Programming)!

留言
avatar-img
留言分享你的想法!
avatar-img
跨越國界的程式人生
2會員
37內容數
自學程式,現為網頁開發工程師,同時擔任線上課程講師,專注於幫助自學程式的開發者找到理想工作。熱愛技術與分享,致力於將複雜的概念轉化為實用知識,讓更多人踏入軟體開發的世界。
2025/06/17
準備Google技術面試?本文分享面試流程、題型、解題技巧及準備心法,包括時間管理、解題模式、溝通能力、複雜度分析等,助你提升應試能力,成為更好的工程師!
Thumbnail
2025/06/17
準備Google技術面試?本文分享面試流程、題型、解題技巧及準備心法,包括時間管理、解題模式、溝通能力、複雜度分析等,助你提升應試能力,成為更好的工程師!
Thumbnail
2025/05/27
這篇文章提供一個完整的指南,幫助你應對系統設計面試,從釐清需求到最終的方案權衡,涵蓋系統設計的各個方面,例如需求闡明、核心組件建立、數據模型設計、系統架構設計、可擴展性考量、可靠性和冗餘性確保、設計優化以及總結與權衡,並提供範例問題和準備技巧。
Thumbnail
2025/05/27
這篇文章提供一個完整的指南,幫助你應對系統設計面試,從釐清需求到最終的方案權衡,涵蓋系統設計的各個方面,例如需求闡明、核心組件建立、數據模型設計、系統架構設計、可擴展性考量、可靠性和冗餘性確保、設計優化以及總結與權衡,並提供範例問題和準備技巧。
Thumbnail
2025/05/21
這篇文章提供2024年愛爾蘭AWS軟體工程師技術面試題目的解析,主題為拼字檢查器的設計與實作。文章逐步深入探討使用Set和Trie資料結構優化效能,分析時間複雜度,並說明如何避免Set的O(N)最壞情況。文章也涵蓋物件導向設計、靜態與實例方法、非同步操作等面向,提供面試準備的寶貴參考。
Thumbnail
2025/05/21
這篇文章提供2024年愛爾蘭AWS軟體工程師技術面試題目的解析,主題為拼字檢查器的設計與實作。文章逐步深入探討使用Set和Trie資料結構優化效能,分析時間複雜度,並說明如何避免Set的O(N)最壞情況。文章也涵蓋物件導向設計、靜態與實例方法、非同步操作等面向,提供面試準備的寶貴參考。
Thumbnail
看更多
你可能也想看
Thumbnail
透過蝦皮分潤計畫,輕鬆賺取零用金!本文分享5-6月實測心得,包含數據流程、實際收入、平臺優點及注意事項,並推薦高分潤商品,教你如何運用空閒時間創造被動收入。
Thumbnail
透過蝦皮分潤計畫,輕鬆賺取零用金!本文分享5-6月實測心得,包含數據流程、實際收入、平臺優點及注意事項,並推薦高分潤商品,教你如何運用空閒時間創造被動收入。
Thumbnail
單身的人有些會養寵物,而我養植物。畢竟寵物離世會傷心,植物沒養好再接再厲就好了~(笑)
Thumbnail
單身的人有些會養寵物,而我養植物。畢竟寵物離世會傷心,植物沒養好再接再厲就好了~(笑)
Thumbnail
不知你有沒有過這種經驗?衛生紙只剩最後一包、洗衣精倒不出來,或電池突然沒電。這次一次補貨,從電池、衛生紙到洗衣精,還順便分享使用心得。更棒的是,搭配蝦皮分潤計畫,愛用品不僅自己用得安心,分享給朋友還能賺回饋。立即使用推薦碼 X5Q344E,輕鬆上手,隨時隨地賺取分潤!
Thumbnail
不知你有沒有過這種經驗?衛生紙只剩最後一包、洗衣精倒不出來,或電池突然沒電。這次一次補貨,從電池、衛生紙到洗衣精,還順便分享使用心得。更棒的是,搭配蝦皮分潤計畫,愛用品不僅自己用得安心,分享給朋友還能賺回饋。立即使用推薦碼 X5Q344E,輕鬆上手,隨時隨地賺取分潤!
Thumbnail
身為一個典型的社畜,上班時間被會議、進度、KPI 塞得滿滿,下班後只想要找一個能夠安靜喘口氣的小角落。對我來說,畫畫就是那個屬於自己的小樹洞。無論是胡亂塗鴉,還是慢慢描繪喜歡的插畫人物,那個專注在筆觸和色彩的過程,就像在幫心靈按摩一樣,讓緊繃的神經慢慢鬆開。
Thumbnail
身為一個典型的社畜,上班時間被會議、進度、KPI 塞得滿滿,下班後只想要找一個能夠安靜喘口氣的小角落。對我來說,畫畫就是那個屬於自己的小樹洞。無論是胡亂塗鴉,還是慢慢描繪喜歡的插畫人物,那個專注在筆觸和色彩的過程,就像在幫心靈按摩一樣,讓緊繃的神經慢慢鬆開。
Thumbnail
題目敘述 Sort Array by Increasing Frequency Leetcode #1636 給定一個輸入陣列,請依照出現頻率的多寡從低頻到高頻排列陣列元素。 如果有兩個元素的出現頻率相同,依照元素大小從大到小排列。 測試範例 Example 1: Input: nums
Thumbnail
題目敘述 Sort Array by Increasing Frequency Leetcode #1636 給定一個輸入陣列,請依照出現頻率的多寡從低頻到高頻排列陣列元素。 如果有兩個元素的出現頻率相同,依照元素大小從大到小排列。 測試範例 Example 1: Input: nums
Thumbnail
給定一個字串陣列,請把它們所共有的字元伴隨著出現次數輸出。這篇文章介紹如何使用字典統計出現次數,和字典取交集的方法來解決此問題。並提供了複雜度分析和關鍵知識點。
Thumbnail
給定一個字串陣列,請把它們所共有的字元伴隨著出現次數輸出。這篇文章介紹如何使用字典統計出現次數,和字典取交集的方法來解決此問題。並提供了複雜度分析和關鍵知識點。
Thumbnail
Leetcode 精選75題 題目與題解 熱門考點 目錄 (持續更新中) 建議從左側目錄 或者 按Ctrl+F輸入關鍵字進行搜尋
Thumbnail
Leetcode 精選75題 題目與題解 熱門考點 目錄 (持續更新中) 建議從左側目錄 或者 按Ctrl+F輸入關鍵字進行搜尋
Thumbnail
給定一個輸入非負整樹陣列nums,請找出k值,使得陣列中恰好有k個元素大於等於 k。如果無解,回傳-1。尋找k值的方法包括排序法和二分搜尋法,時間複雜度都為O(n log n),空間複雜度為O(1)。關鍵知識點是當解空間具有遞增或遞減的性質時,可以用二分搜尋法加快搜尋效率。
Thumbnail
給定一個輸入非負整樹陣列nums,請找出k值,使得陣列中恰好有k個元素大於等於 k。如果無解,回傳-1。尋找k值的方法包括排序法和二分搜尋法,時間複雜度都為O(n log n),空間複雜度為O(1)。關鍵知識點是當解空間具有遞增或遞減的性質時,可以用二分搜尋法加快搜尋效率。
Thumbnail
分享在網路上看到的陣列題目。通常 for...of 的 value 是陣列中的每個值,那如果我們在迭代中對陣列操作會發生什麼事? 題目來源:https://x.com/_jayphelps/status/1774640511158022335?s=20
Thumbnail
分享在網路上看到的陣列題目。通常 for...of 的 value 是陣列中的每個值,那如果我們在迭代中對陣列操作會發生什麼事? 題目來源:https://x.com/_jayphelps/status/1774640511158022335?s=20
Thumbnail
題目會給定一個陣列nums和一個目標值goal。計算子陣列總和=goal的數目有多少。演算法包含前綴和和字典的技巧,時間複雜度為O(n),空間複雜度為O(n)。
Thumbnail
題目會給定一個陣列nums和一個目標值goal。計算子陣列總和=goal的數目有多少。演算法包含前綴和和字典的技巧,時間複雜度為O(n),空間複雜度為O(n)。
Thumbnail
題目敘述 題目會給定一個二元陣列nums(也就是說,陣列元素只有0,1這兩種情況)和指定的k值。 我們最多可以把k個0反轉成1,請問連續唯一的最長子陣列的長度是多少? 題目的原文敘述 測試範例 Example 1: Input: nums = [1,1,1,0,0,0,1,1,1,1,
Thumbnail
題目敘述 題目會給定一個二元陣列nums(也就是說,陣列元素只有0,1這兩種情況)和指定的k值。 我們最多可以把k個0反轉成1,請問連續唯一的最長子陣列的長度是多少? 題目的原文敘述 測試範例 Example 1: Input: nums = [1,1,1,0,0,0,1,1,1,1,
Thumbnail
題目敘述 題目會給定一個有n個整數的陣列nums和指定的k值,問我們長度為k的子陣列的平均值的最大值是多少? 題目的原文敘述 測試範例 Example 1: Input: nums = [1,12,-5,-6,50,3], k = 4 Output: 12.75000 Explanati
Thumbnail
題目敘述 題目會給定一個有n個整數的陣列nums和指定的k值,問我們長度為k的子陣列的平均值的最大值是多少? 題目的原文敘述 測試範例 Example 1: Input: nums = [1,12,-5,-6,50,3], k = 4 Output: 12.75000 Explanati
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News