面試常見演算法 — JavaScript

更新 發佈閱讀 13 分鐘

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

這篇文章整理了 JavaScript 中常見的演算法與資料結構題型,包括排列組合、排序、搜尋、樹與鏈結串列等,並為每段程式碼附上簡短說明,幫助你快速理解其應用情境與邏輯。無論你正在準備前端、全端或軟體工程師面試,這是一份可以在面試前快速翻閱的筆記,幫助你臨陣不亂,打好演算法基礎!


1. 排列(Permutations)

說明: 產生所有可能的排列組合,常見於排列問題、DFS 樹狀結構遍歷。

javascript
複製編輯var permute = function(nums) {
const result = [];
const backtrack = (nums, path) => {
if (nums.length === 0) {
result.push(path);
return;
}
for (let i = 0; i < nums.length; i++) {
backtrack([...nums.slice(0, i), ...nums.slice(i + 1)], [...path, nums[i]]);
}
};
backtrack(nums, []);
return result;
};

2. 組合(Combinations)

說明: 從 n 個數中選出 k 個不重複的組合,常用於組合問題或 DFS 剪枝題。

javascript
複製編輯var combine = function(n, k) {
const result = [];
backtrack(n, k, 1, [], result);
return result;
};

function backtrack(n, k, start, combination, result) {
if (combination.length === k) {
result.push([...combination]);
return;
}
for (let i = start; i <= n; i++) {
combination.push(i);
backtrack(n, k, i + 1, combination, result);
combination.pop();
}
}

3. 二分搜尋(Binary Search)

說明: 適用於有序陣列,以對半方式高效搜尋目標值,時間複雜度 O(log n)。

javascript
複製編輯var search = function(nums, target) {
let left = 0, right = nums.length - 1;
while (right >= left) {
let mid = Math.floor((left + right) / 2);
if (target > nums[mid]) {
left = mid + 1;
} else if (target < nums[mid]) {
right = mid - 1;
} else {
return mid;
}
}
return -1;
};

4. 合併排序(Merge Sort)

說明: 經典的排序演算法,使用「分而治之」策略,穩定排序,時間複雜度 O(n log n)。

javascript
複製編輯function merge(left, right) {
let arr = [];
while (left.length && right.length) {
if (left[0] < right[0]) {
arr.push(left.shift());
} else {
arr.push(right.shift());
}
}
return [...arr, ...left, ...right];
}

var sortArray = function(nums) {
if (nums.length < 2) return nums;
const half = Math.floor(nums.length / 2);
const left = nums.splice(0, half);
return merge(sortArray(left), sortArray(nums));
};

5. 快速排序(Quick Sort)

說明: 常用的原地排序方法,透過選定 pivot 分區再遞迴處理,平均時間複雜度 O(n log n)。

javascript
複製編輯var sortArray = function(nums) {
return quickSort(nums);
};

function pivot(arr, start = 0, end = arr.length - 1) {
function swap(array, i, j) {
[array[i], array[j]] = [array[j], array[i]];
}

let pivot = arr[start];
let swapIdx = start;

for (let i = start + 1; i <= end; i++) {
if (arr[i] < pivot) {
swapIdx++;
swap(arr, swapIdx, i);
}
}
swap(arr, start, swapIdx);
return swapIdx;
}

function quickSort(arr, left = 0, right = arr.length - 1) {
if (left < right) {
let pivotIndex = pivot(arr, left, right);
quickSort(arr, left, pivotIndex - 1);
quickSort(arr, pivotIndex + 1, right);
}
return arr;
}

6. 快速選擇(Quick Select)

說明: 找出第 k 小元素的高效演算法,類似 Quick Sort,但只處理一側,時間複雜度平均為 O(n)。

javascript
複製編輯function quickSelect(arr, left, right, k) {
if (left === right) return arr[left];
let pivotIndex = partition(arr, left, right);

if (k === pivotIndex) {
return arr[k];
} else if (k < pivotIndex) {
return quickSelect(arr, left, pivotIndex - 1, k);
} else {
return quickSelect(arr, pivotIndex + 1, right, k);
}
}

function partition(arr, left, right) {
let pivot = arr[right];
let i = left;
for (let j = left; j < right; j++) {
if (arr[j] <= pivot) {
[arr[i], arr[j]] = [arr[j], arr[i]];
i++;
}
}
[arr[i], arr[right]] = [arr[right], arr[i]];
return i;
}

// 使用範例
const arr = [3, 2, 1, 5, 4];
const k = 2;
console.log(quickSelect(arr, 0, arr.length - 1, k)); // 輸出 3

7. 二元樹中序遍歷(Inorder Traversal)

說明: 以「左 → 根 → 右」順序遍歷樹,常見於 BST 中可得到排序結果。

javascript
複製編輯var inorderTraversal = function(root) {
if (!root) return [];
return traversal(root, []);
};

function traversal(node, result) {
if (!node) return;
traversal(node.left, result);
result.push(node.val);
traversal(node.right, result);
return result;
}

8. 廣度優先搜尋(BFS)

說明: 一層一層遍歷樹的節點,常用於圖的最短路徑或層序遍歷。

javascript
複製編輯let queue = [root], ans = [];
while (queue.length > 0) {
let qlen = queue.length, row = [];
for (let i = 0; i < qlen; i++) {
let curr = queue.shift();
row.push(curr.val);
if (curr.left) queue.push(curr.left);
if (curr.right) queue.push(curr.right);
}
ans.push(row);
}
return ans;

9. 反轉鏈結串列(Reverse Linked List)

說明: 反轉單向鏈結串列的指向方向,是常見的基礎操作。

javascript
複製編輯let prev = null, curr = head;
while (curr) {
let nextTemp = curr.next;
curr.next = prev;
prev = curr;
curr = nextTemp;
}
return prev;

10. 樹節點類別範例(Tree Node Class)

說明: 建立一個簡單的多叉樹節點結構,可擴展用於樹建構、遍歷等應用。

javascript
複製編輯class Node {
constructor(key, value = key, parent = null) {
this.key = key;
this.value = value;
this.parent = parent;
this.children = [];
}
}

📌 總結

這些演算法是前端與全端開發者在面試時最常遇到的題型。熟悉它們的實作與原理,不僅能加快解題速度,也有助於寫出更具可讀性與效率的程式。

留言
avatar-img
跨越國界的程式人生
5會員
41內容數
自學程式,現為網頁開發工程師,同時擔任線上課程講師,專注於幫助自學程式的開發者找到理想工作。熱愛技術與分享,致力於將複雜的概念轉化為實用知識,讓更多人踏入軟體開發的世界。
2025/06/19
求職過程中的經驗分享,涵蓋多家公司的面試流程、技術問題、薪資待遇以及最終結果。作者分享了準備面試的心得,並建議求職者持續學習、紀錄錯誤、瞭解市場趨勢,提升自身競爭力。
Thumbnail
2025/06/19
求職過程中的經驗分享,涵蓋多家公司的面試流程、技術問題、薪資待遇以及最終結果。作者分享了準備面試的心得,並建議求職者持續學習、紀錄錯誤、瞭解市場趨勢,提升自身競爭力。
Thumbnail
2025/06/19
這篇文章分享作者的面試經驗,提供求職者寶貴的建議,包括投遞策略、如何評估公司和職位,以及如何提升自身競爭力。文章涵蓋多家公司的面試過程細節,並提出將自身能力分配給求職標準的有效方法。
Thumbnail
2025/06/19
這篇文章分享作者的面試經驗,提供求職者寶貴的建議,包括投遞策略、如何評估公司和職位,以及如何提升自身競爭力。文章涵蓋多家公司的面試過程細節,並提出將自身能力分配給求職標準的有效方法。
Thumbnail
2025/06/17
這篇文章模擬了一段面試實戰,主題是找出陣列中出現頻率最高的 k 個元素。文章詳細介紹瞭解題思路,包括使用 Map 計算頻率和使用最小堆維持 top k 元素,並比較了不同方法的優缺點。最後,文章總結了面試技巧,以及這類題目在面試中的重要性。
Thumbnail
2025/06/17
這篇文章模擬了一段面試實戰,主題是找出陣列中出現頻率最高的 k 個元素。文章詳細介紹瞭解題思路,包括使用 Map 計算頻率和使用最小堆維持 top k 元素,並比較了不同方法的優缺點。最後,文章總結了面試技巧,以及這類題目在面試中的重要性。
Thumbnail
看更多
你可能也想看
Thumbnail
在 vocus 與你一起探索內容、發掘靈感的路上,我們又將啟動新的冒險——vocus App 正式推出! 現在起,你可以在 iOS App Store 下載全新上架的 vocus App。 無論是在通勤路上、日常空檔,或一天結束後的放鬆時刻,都能自在沈浸在內容宇宙中。
Thumbnail
在 vocus 與你一起探索內容、發掘靈感的路上,我們又將啟動新的冒險——vocus App 正式推出! 現在起,你可以在 iOS App Store 下載全新上架的 vocus App。 無論是在通勤路上、日常空檔,或一天結束後的放鬆時刻,都能自在沈浸在內容宇宙中。
Thumbnail
vocus 慶祝推出 App,舉辦 2026 全站慶。推出精選內容與數位商品折扣,訂單免費與紅包抽獎、新註冊會員專屬活動、Boba Boost 贊助抽紅包,以及全站徵文,並邀請你一起來回顧過去的一年, vocus 與創作者共同留下了哪些精彩創作。
Thumbnail
vocus 慶祝推出 App,舉辦 2026 全站慶。推出精選內容與數位商品折扣,訂單免費與紅包抽獎、新註冊會員專屬活動、Boba Boost 贊助抽紅包,以及全站徵文,並邀請你一起來回顧過去的一年, vocus 與創作者共同留下了哪些精彩創作。
Thumbnail
本文提供了一個關於模擬法演算法的問題,介紹了操作指令的格式及其解析。透過程式碼模擬每條指令,找出回到根目錄所需的操作次數。本文詳細說明瞭模擬法的複雜度分析,能夠幫助讀者更好地理解這個問題。
Thumbnail
本文提供了一個關於模擬法演算法的問題,介紹了操作指令的格式及其解析。透過程式碼模擬每條指令,找出回到根目錄所需的操作次數。本文詳細說明瞭模擬法的複雜度分析,能夠幫助讀者更好地理解這個問題。
Thumbnail
高中數學主題練習—對數方程式
Thumbnail
高中數學主題練習—對數方程式
Thumbnail
了解這些運算子及其優先等級有助於更好地理解和編寫 JavaScript 代碼
Thumbnail
了解這些運算子及其優先等級有助於更好地理解和編寫 JavaScript 代碼
Thumbnail
Leetcode 精選75題 題目與題解 熱門考點 目錄 (持續更新中) 建議從左側目錄 或者 按Ctrl+F輸入關鍵字進行搜尋
Thumbnail
Leetcode 精選75題 題目與題解 熱門考點 目錄 (持續更新中) 建議從左側目錄 或者 按Ctrl+F輸入關鍵字進行搜尋
Thumbnail
在本章節中,我們將學習JavaScript的基本語法,包括如何註解代碼和如何聲明變數。瞭解這些基礎知識對於進一步學習和使用JavaScript來編寫代碼是非常重要的。
Thumbnail
在本章節中,我們將學習JavaScript的基本語法,包括如何註解代碼和如何聲明變數。瞭解這些基礎知識對於進一步學習和使用JavaScript來編寫代碼是非常重要的。
Thumbnail
演算法映射化簡的核心觀念 在面對新題目的時候,除了重頭想一個新的演算法之外; 還有另一個方法,想看看有沒有核心觀念彼此相同的問題與演算法, 如果有,就可以把新的題目映射化簡到已知解法的問題,用已知的演算法去解開。 接著,我們會介紹幾個範例,並且使用映射化簡的技巧來解題,透過化
Thumbnail
演算法映射化簡的核心觀念 在面對新題目的時候,除了重頭想一個新的演算法之外; 還有另一個方法,想看看有沒有核心觀念彼此相同的問題與演算法, 如果有,就可以把新的題目映射化簡到已知解法的問題,用已知的演算法去解開。 接著,我們會介紹幾個範例,並且使用映射化簡的技巧來解題,透過化
Thumbnail
最近有新的訂閱者加入, 想趁這個機會再分享一次學習心法與建議給第一次練習的讀者、同學們。 如果你本身已經很熟練演算法,那隨機挑題目練習ok,可以測試觀念是否正確,並且驗證寫code的效率與正確程度。 如果是剛畢業或還在學,以前沒有打過程式競賽。 想開始有系統地增強演算法&資料結構的能力
Thumbnail
最近有新的訂閱者加入, 想趁這個機會再分享一次學習心法與建議給第一次練習的讀者、同學們。 如果你本身已經很熟練演算法,那隨機挑題目練習ok,可以測試觀念是否正確,並且驗證寫code的效率與正確程度。 如果是剛畢業或還在學,以前沒有打過程式競賽。 想開始有系統地增強演算法&資料結構的能力
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
解決電腦上遇到的問題、證明正確性、探討效率 並且很著重溝通,說服別人你做的事是正確且有效率的。 內容: 計算模型、資料結構介紹、演算法介紹、時間複雜度介紹。
Thumbnail
解決電腦上遇到的問題、證明正確性、探討效率 並且很著重溝通,說服別人你做的事是正確且有效率的。 內容: 計算模型、資料結構介紹、演算法介紹、時間複雜度介紹。
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News