vocus logo

方格子 vocus

面試實戰:找出陣列中出現頻率最高的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
跨越國界的程式人生
5會員
41內容數
自學程式,現為網頁開發工程師,同時擔任線上課程講師,專注於幫助自學程式的開發者找到理想工作。熱愛技術與分享,致力於將複雜的概念轉化為實用知識,讓更多人踏入軟體開發的世界。
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
賽勒布倫尼科夫以流亡處境回望蘇聯電影導演帕拉贊諾夫的舞台作品,以十段寓言式殘篇,重新拼貼記憶、暴力與美學,並將審查、政治犯、戰爭陰影與「形式即政治」的劇場傳統推到台前。本文聚焦於《傳奇:帕拉贊諾夫的十段殘篇》的舞台美術、音樂與多重扮演策略,嘗試解析極權底下不可言說之事,將如何成為可被觀看的公共發聲。
Thumbnail
賽勒布倫尼科夫以流亡處境回望蘇聯電影導演帕拉贊諾夫的舞台作品,以十段寓言式殘篇,重新拼貼記憶、暴力與美學,並將審查、政治犯、戰爭陰影與「形式即政治」的劇場傳統推到台前。本文聚焦於《傳奇:帕拉贊諾夫的十段殘篇》的舞台美術、音樂與多重扮演策略,嘗試解析極權底下不可言說之事,將如何成為可被觀看的公共發聲。
Thumbnail
柏林劇團在 2026 北藝嚴選,再次帶來由布萊希特改編的經典劇目《三便士歌劇》(The Threepenny Opera),導演巴里・柯斯基以舞台結構與舞台調度,重新向「疏離」進行提問。本文將從觀眾慾望作為戲劇內核,藉由沉浸與疏離的辯證,解析此作如何再次照見觀眾自身的位置。
Thumbnail
柏林劇團在 2026 北藝嚴選,再次帶來由布萊希特改編的經典劇目《三便士歌劇》(The Threepenny Opera),導演巴里・柯斯基以舞台結構與舞台調度,重新向「疏離」進行提問。本文將從觀眾慾望作為戲劇內核,藉由沉浸與疏離的辯證,解析此作如何再次照見觀眾自身的位置。
Thumbnail
本文深入解析臺灣劇團「晃晃跨幅町」對易卜生經典劇作《海妲.蓋柏樂》的詮釋,從劇本歷史、聲響與舞臺設計,到演員的主體創作方法,探討此版本如何讓經典劇作在當代劇場語境下煥發新生,滿足現代觀眾的觀看慾望。
Thumbnail
本文深入解析臺灣劇團「晃晃跨幅町」對易卜生經典劇作《海妲.蓋柏樂》的詮釋,從劇本歷史、聲響與舞臺設計,到演員的主體創作方法,探討此版本如何讓經典劇作在當代劇場語境下煥發新生,滿足現代觀眾的觀看慾望。
Thumbnail
《轉轉生》為奈及利亞編舞家庫德斯.奧尼奎庫與 Q 舞團創作的當代舞蹈作品,融合舞蹈、音樂、時尚和視覺藝術,透過身體、服裝與群舞結構,回應殖民歷史、城市經驗與祖靈記憶的交錯。本文將從服裝設計、身體語彙與「輪迴」的「誕生—死亡—重生」結構出發,分析《轉轉生》如何以當代目光,形塑去殖民視角的奈及利亞歷史。
Thumbnail
《轉轉生》為奈及利亞編舞家庫德斯.奧尼奎庫與 Q 舞團創作的當代舞蹈作品,融合舞蹈、音樂、時尚和視覺藝術,透過身體、服裝與群舞結構,回應殖民歷史、城市經驗與祖靈記憶的交錯。本文將從服裝設計、身體語彙與「輪迴」的「誕生—死亡—重生」結構出發,分析《轉轉生》如何以當代目光,形塑去殖民視角的奈及利亞歷史。
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