面試常見演算法 — 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
留言分享你的想法!
avatar-img
跨越國界的程式人生
2會員
32內容數
自學程式,現為網頁開發工程師,同時擔任線上課程講師,專注於幫助自學程式的開發者找到理想工作。熱愛技術與分享,致力於將複雜的概念轉化為實用知識,讓更多人踏入軟體開發的世界。
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
本文提供了一個關於模擬法演算法的問題,介紹了操作指令的格式及其解析。透過程式碼模擬每條指令,找出回到根目錄所需的操作次數。本文詳細說明瞭模擬法的複雜度分析,能夠幫助讀者更好地理解這個問題。
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的效率與正確程度。 如果是剛畢業或還在學,以前沒有打過程式競賽。 想開始有系統地增強演算法&資料結構的能力
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News