軟體工程師職涯升級計畫啟動!立即預約職涯諮詢、履歷健檢或模擬面試👈,為您的加薪做好準備!
資料結構與演算法是技術面試中的重點,無論是前端、後端還是全端工程師,這些基礎能力都是決定錄取與否的重要關鍵。
這篇文章整理了常見的演算法題型,包含:排列組合、搜尋、排序、樹與鏈結串列等,並提供對應的 JavaScript 實作與 LeetCode 題號,協助你更有系統地準備面試。
🔢 Permutations(排列)
📌 LeetCode 46 - Permutationsjs
複製編輯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;
};
👉 用途說明:排列問題常見於字串操作、遊戲邏輯、DFS 題目,是遞迴與 backtracking 的經典應用。
🎯 Combinations(組合)
📌 LeetCode 77 - Combinations
js
複製編輯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();
}
}
👉 用途說明:組合可應用於選課系統、權限管理等問題,搭配剪枝邏輯可進一步優化效能。
🔍 Binary Search(二分搜尋)
📌 LeetCode 704 - Binary Search
js
複製編輯var search = function(nums, target) {
let left = 0, right = nums.length - 1;
while (left <= right) {
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;
};
👉 用途說明:用於有序陣列的高效搜尋,時間複雜度為 O(log n)。
🧩 Merge Sort(合併排序)
📌 LeetCode 912 - Sort an Array
js
複製編輯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 mid = Math.floor(nums.length / 2);
const left = nums.splice(0, mid);
return merge(sortArray(left), sortArray(nums));
};
👉 用途說明:穩定排序演算法,常用於大量資料的排序需求。時間複雜度為 O(n log n)。
⚡ Quick Sort(快速排序)
js
複製編輯var sortArray = function(nums) {
return quickSort(nums);
};
function pivot(arr, start = 0, end = arr.length - 1) {
let pivot = arr[start], swapIdx = start;
for (let i = start + 1; i <= end; i++) {
if (arr[i] < pivot) {
swapIdx++;
[arr[swapIdx], arr[i]] = [arr[i], arr[swapIdx]];
}
}
[arr[start], arr[swapIdx]] = [arr[swapIdx], arr[start]];
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;
}
👉 用途說明:最快的比較排序之一(平均 O(n log n)),但在 worst case 下會退化成 O(n²)。
🏹 Quick Select(第 k 小元素)
📌 LeetCode 215 - Kth Largest Element in an Array
js
複製編輯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], 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];
console.log(quickSelect(arr, 0, arr.length - 1, 2)); // 第 3 小,結果為 3
👉 用途說明:常用於 top-k 題型,比完整排序更省時間,平均時間複雜度為 O(n)。
🌲 Binary Tree Inorder Traversal(二元樹中序走訪)
📌 LeetCode 94 - Binary Tree Inorder Traversal
js
複製編輯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;
}
👉 用途說明:中序遍歷會依照節點值由小到大排序,常用於搜尋與樹的轉換。
🔁 BFS(廣度優先搜尋)
📌 LeetCode 102 - Binary Tree Level Order Traversal
js
複製編輯let queue = [root], ans = [];
while (queue.length) {
let levelSize = queue.length, row = [];
for (let i = 0; i < levelSize; 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;
👉 用途說明:廣度優先搜尋適合找最短路徑、逐層遍歷的場景,例如找最小深度。
🔄 Reverse Linked List(反轉鏈結串列)
📌 LeetCode 206 - Reverse Linked List
js
複製編輯let prev = null, curr = head;
while (curr) {
let nextTemp = curr.next;
curr.next = prev;
prev = curr;
curr = nextTemp;
}
return prev;
👉 用途說明:常見面試題,考察指標操作與 linked list 基礎。
🌳 Tree 資料結構實作
js
複製編輯class Node {
constructor(key, value = key, parent = null) {
this.key = key;
this.value = value;
this.parent = parent;
this.children = [];
}
}
👉 用途說明:可用於表示 DOM Tree、檔案系統或公司組織結構等階層資料。
📚 小結
這些範例涵蓋了前端與全端工程師常見的演算法題型。若你正準備技術面試,建議這些題目至少都要理解、實作、優化一次!
💬 如果你對某個題型還不熟悉,歡迎留言討論或點擊連結到 LeetCode 練習,一起把演算法練起來!