Skip to content

算法数据结构面试题 ​

整理算法和数据结构的面试题,涵盖常见算法题和数据结构题,包含详细的答案和解析。

📋 题目分类 ​

🎯 一、数据结构 ​

1. 数组和链表的区别? ​

答案:

区别对比:

特性数组链表
内存结构连续内存非连续内存
随机访问O(1)O(n)
插入删除O(n)O(1)
内存占用固定大小动态大小

2. 二叉树的遍历方式? ​

答案:

二叉树遍历方式:

  1. 前序遍历:根 -> 左 -> 右
  2. 中序遍历:左 -> 根 -> 右
  3. 后序遍历:左 -> 右 -> 根
  4. 层序遍历:按层遍历

代码实现:

java
// 前序遍历
public void preOrder(TreeNode root) {
    if (root == null) return;
    System.out.println(root.val);
    preOrder(root.left);
    preOrder(root.right);
}

// 中序遍历
public void inOrder(TreeNode root) {
    if (root == null) return;
    inOrder(root.left);
    System.out.println(root.val);
    inOrder(root.right);
}

// 后序遍历
public void postOrder(TreeNode root) {
    if (root == null) return;
    postOrder(root.left);
    postOrder(root.right);
    System.out.println(root.val);
}

🎯 二、算法 ​

3. 常见的排序算法有哪些?时间复杂度是多少? ​

答案:

常见排序算法:

算法平均时间复杂度最好时间复杂度最坏时间复杂度空间复杂度稳定性
冒泡排序O(n²)O(n)O(n²)O(1)稳定
选择排序O(n²)O(n²)O(n²)O(1)不稳定
插入排序O(n²)O(n)O(n²)O(1)稳定
快速排序O(n log n)O(n log n)O(n²)O(log n)不稳定
归并排序O(n log n)O(n log n)O(n log n)O(n)稳定
堆排序O(n log n)O(n log n)O(n log n)O(1)不稳定

4. 快速排序的原理? ​

答案:

快速排序原理:

  1. 选择基准:选择一个基准元素(pivot)
  2. 分区:将数组分为两部分,小于基准的在左边,大于基准的在右边
  3. 递归:递归处理左右两部分

代码实现:

java
public void quickSort(int[] arr, int low, int high) {
    if (low < high) {
        int pivot = partition(arr, low, high);
        quickSort(arr, low, pivot - 1);
        quickSort(arr, pivot + 1, high);
    }
}

private int partition(int[] arr, int low, int high) {
    int pivot = arr[high];
    int i = low - 1;
    for (int j = low; j < high; j++) {
        if (arr[j] < pivot) {
            i++;
            swap(arr, i, j);
        }
    }
    swap(arr, i + 1, high);
    return i + 1;
}

5. 动态规划的核心思想? ​

答案:

动态规划核心思想:

  1. 最优子结构:问题的最优解包含子问题的最优解
  2. 重叠子问题:子问题会被重复计算
  3. 状态转移方程:找到状态之间的转移关系

经典问题:

  • 背包问题
  • 最长公共子序列
  • 最长递增子序列
  • 编辑距离

🎯 三、LeetCode经典题 ​

6. 两数之和(LeetCode 1) ​

题目:

给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出和为目标值 target 的那两个整数,并返回它们的数组下标。

解法:

java
public int[] twoSum(int[] nums, int target) {
    Map<Integer, Integer> map = new HashMap<>();
    for (int i = 0; i < nums.length; i++) {
        int complement = target - nums[i];
        if (map.containsKey(complement)) {
            return new int[]{map.get(complement), i};
        }
        map.put(nums[i], i);
    }
    return new int[]{};
}

时间复杂度: O(n)
空间复杂度: O(n)

7. 反转链表(LeetCode 206) ​

题目:

反转一个单链表。

解法:

java
public ListNode reverseList(ListNode head) {
    ListNode prev = null;
    ListNode curr = head;
    while (curr != null) {
        ListNode next = curr.next;
        curr.next = prev;
        prev = curr;
        curr = next;
    }
    return prev;
}

时间复杂度: O(n)
空间复杂度: O(1)

📖 学习资源 ​

视频教程 ​

书籍推荐 ​

  • 《算法导论》 - Thomas H. Cormen
  • 《数据结构与算法分析》 - Mark Allen Weiss

网站资源 ​

✅ 学习检查清单 ​

  • [ ] 已掌握常见数据结构
  • [ ] 已掌握常见算法
  • [ ] 已练习LeetCode经典题
  • [ ] 已总结解题思路
  • [ ] 已提升算法能力

上一章节:中间件面试题
下一章节:系统设计面试题
返回目录:面试题