軟體工程師面試必備:常見演算法題型與 LeetCode 練習

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

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


資料結構與演算法是技術面試中的重點,無論是前端、後端還是全端工程師,這些基礎能力都是決定錄取與否的重要關鍵。

這篇文章整理了常見的演算法題型,包含:排列組合、搜尋、排序、樹與鏈結串列等,並提供對應的 JavaScript 實作與 LeetCode 題號,協助你更有系統地準備面試。


🔢 Permutations(排列)

📌 LeetCode 46 - Permutations

js
複製編輯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 練習,一起把演算法練起來!

留言
avatar-img
留言分享你的想法!
avatar-img
跨越國界的程式人生
2會員
32內容數
自學程式,現為網頁開發工程師,同時擔任線上課程講師,專注於幫助自學程式的開發者找到理想工作。熱愛技術與分享,致力於將複雜的概念轉化為實用知識,讓更多人踏入軟體開發的世界。
2025/07/21
這篇文章深入淺出地探討 React 的 useEffect Hook 在處理多個非同步請求時的執行順序,並提供使用 Promise.all 等待所有 API 回應後再渲染畫面的解決方案。文中並包含程式碼範例與詳細的步驟說明,協助讀者理解 useEffect 的運作機制與常見問題。
Thumbnail
2025/07/21
這篇文章深入淺出地探討 React 的 useEffect Hook 在處理多個非同步請求時的執行順序,並提供使用 Promise.all 等待所有 API 回應後再渲染畫面的解決方案。文中並包含程式碼範例與詳細的步驟說明,協助讀者理解 useEffect 的運作機制與常見問題。
Thumbnail
2025/07/17
這篇文章深入淺出地介紹 HTTP 快取(Cache)的概念、類型(私有和共用快取)、常見的 Cache-Control 設定,以及其在提升網站效能和使用者體驗方面的作用。文章包含圖表和流程圖,並提供額外的學習資源連結,方便讀者更深入瞭解 HTTP 快取機制。
Thumbnail
2025/07/17
這篇文章深入淺出地介紹 HTTP 快取(Cache)的概念、類型(私有和共用快取)、常見的 Cache-Control 設定,以及其在提升網站效能和使用者體驗方面的作用。文章包含圖表和流程圖,並提供額外的學習資源連結,方便讀者更深入瞭解 HTTP 快取機制。
Thumbnail
2025/07/17
現代Web架構前後端分離盛行,但增加了前端與後端API互動的風險。本文介紹Proxy(代理伺服器)如何作為中介層,解決API網址暴露、跨來源請求(CORS)問題和權限控管等挑戰,提升API使用的安全性和彈性。文中包含Proxy的應用場景、Node.js實作範例,以及安全性考量。
Thumbnail
2025/07/17
現代Web架構前後端分離盛行,但增加了前端與後端API互動的風險。本文介紹Proxy(代理伺服器)如何作為中介層,解決API網址暴露、跨來源請求(CORS)問題和權限控管等挑戰,提升API使用的安全性和彈性。文中包含Proxy的應用場景、Node.js實作範例,以及安全性考量。
Thumbnail
看更多
你可能也想看
Thumbnail
本文提供了一個關於模擬法演算法的問題,介紹了操作指令的格式及其解析。透過程式碼模擬每條指令,找出回到根目錄所需的操作次數。本文詳細說明瞭模擬法的複雜度分析,能夠幫助讀者更好地理解這個問題。
Thumbnail
本文提供了一個關於模擬法演算法的問題,介紹了操作指令的格式及其解析。透過程式碼模擬每條指令,找出回到根目錄所需的操作次數。本文詳細說明瞭模擬法的複雜度分析,能夠幫助讀者更好地理解這個問題。
Thumbnail
LeetCode 是一個程式語言版的線上題庫平臺,提供題目描述、程式碼區塊、解題者分享的解法和疑問討論。藉由這篇文章分享我在 LeetCode 上的使用經驗和觀點,包括刷題的重要性、解題心態和練習目標。
Thumbnail
LeetCode 是一個程式語言版的線上題庫平臺,提供題目描述、程式碼區塊、解題者分享的解法和疑問討論。藉由這篇文章分享我在 LeetCode 上的使用經驗和觀點,包括刷題的重要性、解題心態和練習目標。
Thumbnail
高中數學主題練習—對數方程式
Thumbnail
高中數學主題練習—對數方程式
Thumbnail
Leetcode 精選75題 題目與題解 熱門考點 目錄 (持續更新中) 建議從左側目錄 或者 按Ctrl+F輸入關鍵字進行搜尋
Thumbnail
Leetcode 精選75題 題目與題解 熱門考點 目錄 (持續更新中) 建議從左側目錄 或者 按Ctrl+F輸入關鍵字進行搜尋
Thumbnail
最近有新的訂閱者加入, 想趁這個機會再分享一次學習心法與建議給第一次練習的讀者、同學們。 如果你本身已經很熟練演算法,那隨機挑題目練習ok,可以測試觀念是否正確,並且驗證寫code的效率與正確程度。 如果是剛畢業或還在學,以前沒有打過程式競賽。 想開始有系統地增強演算法&資料結構的能力
Thumbnail
最近有新的訂閱者加入, 想趁這個機會再分享一次學習心法與建議給第一次練習的讀者、同學們。 如果你本身已經很熟練演算法,那隨機挑題目練習ok,可以測試觀念是否正確,並且驗證寫code的效率與正確程度。 如果是剛畢業或還在學,以前沒有打過程式競賽。 想開始有系統地增強演算法&資料結構的能力
Thumbnail
題目會給定一個陣列nums和一個目標值goal。計算子陣列總和=goal的數目有多少。演算法包含前綴和和字典的技巧,時間複雜度為O(n),空間複雜度為O(n)。
Thumbnail
題目會給定一個陣列nums和一個目標值goal。計算子陣列總和=goal的數目有多少。演算法包含前綴和和字典的技巧,時間複雜度為O(n),空間複雜度為O(n)。
Thumbnail
題目敘述 題目會給定一個輸入字串s和一套編碼規則,要求我們針對字串s進行解碼,並且以字串的形式返回答案。 編碼規則: 數字[字串] -> []內的字串以對應倍數做展開,而且允許巢狀編碼。 例如: 3[a] 解碼完就是 aaa 2[bc] 解碼完就是 bcbc 2[a2[b]] = 2
Thumbnail
題目敘述 題目會給定一個輸入字串s和一套編碼規則,要求我們針對字串s進行解碼,並且以字串的形式返回答案。 編碼規則: 數字[字串] -> []內的字串以對應倍數做展開,而且允許巢狀編碼。 例如: 3[a] 解碼完就是 aaa 2[bc] 解碼完就是 bcbc 2[a2[b]] = 2
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News