简介

本资源详细介绍了常见算法,包括排序、搜索、动态规划等,提供了丰富的刷题资源,含题目解析与代码实现。同时涵盖了各大公司笔试和面试的经典算法题,助您轻松应对求职挑战。


目录

  1. 排序算法

    • 冒泡排序
    • 选择排序
    • 插入排序
    • 快速排序
    • 归并排序
  2. 搜索算法

    • 线性搜索
    • 二分搜索
    • 深度优先搜索(DFS)
    • 广度优先搜索(BFS)
  3. 动态规划

    • 斐波那契数列
    • 最长公共子序列
    • 背包问题
    • 最小路径和
  4. 刷题资源

    • LeetCode 高频题
    • 牛客网经典题
  5. 笔试面试题

    • 字节跳动
    • 阿里巴巴
    • 腾讯
    • 美团

1. 排序算法

冒泡排序

介绍:
冒泡排序是一种简单的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。

代码实现:

def bubble_sort(arr):
    n = len(arr)
    for i in range(n):
        for j in range(0, n-i-1):
            if arr[j] > arr[j+1]:
                arr[j], arr[j+1] = arr[j+1], arr[j]
    return arr
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.

例题解析:
题目:对一个未排序的数组进行冒泡排序,输出排序后的数组。

# 输入
arr = [64, 34, 25, 12, 22, 11, 90]
# 输出
sorted_arr = bubble_sort(arr)
print(sorted_arr)
# 结果:[11, 12, 22, 25, 34, 64, 90]
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
选择排序

介绍:
选择排序是一种简单直观的排序算法。它的工作原理如下:首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。以此类推,直到所有元素均排序完毕。

代码实现:

def selection_sort(arr):
    for i in range(len(arr)):
        min_idx = i
        for j in range(i+1, len(arr)):
            if arr[j] < arr[min_idx]:
                min_idx = j
        arr[i], arr[min_idx] = arr[min_idx], arr[i]
    return arr
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.

例题解析:
题目:对一个未排序的数组进行选择排序,输出排序后的数组。

# 输入
arr = [64, 25, 12, 22, 11]
# 输出
sorted_arr = selection_sort(arr)
print(sorted_arr)
# 结果:[11, 12, 22, 25, 64]
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.

2. 搜索算法

二分搜索

介绍:
二分搜索,也称折半搜索,是一种在有序数组中查找某一特定元素的搜索算法。搜索过程从数组的中间元素开始,如果中间元素正好是要查找的元素,则搜索过程结束;如果某一特定元素大于或者小于中间元素,则在数组大于或小于中间元素的那一半中查找,而且同样从中间元素开始比较。

代码实现:

def binary_search(arr, x):
    l, r = 0, len(arr) - 1
    while l <= r:
        mid = (l + r) // 2
        if arr[mid] == x:
            return mid
        elif arr[mid] < x:
            l = mid + 1
        else:
            r = mid - 1
    return -1
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.

例题解析:
题目:在有序数组中查找目标值,返回目标值所在的索引位置。

# 输入
arr = [2, 3, 4, 10, 40]
x = 10
# 输出
result = binary_search(arr, x)
print(result)
# 结果:3
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.

3. 动态规划

斐波那契数列

介绍:
斐波那契数列是一个经典的动态规划问题。斐波那契数列由 0 和 1 开始,之后的斐波那契数就是前面两者的和。即 F(n) = F(n-1) + F(n-2)。

代码实现:

def fibonacci(n):
    if n <= 0:
        return 0
    elif n == 1:
        return 1
    else:
        fib = [0, 1]
        for i in range(2, n+1):
            fib.append(fib[-1] + fib[-2])
        return fib[n]
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.

例题解析:
题目:求斐波那契数列的第 n 项。

# 输入
n = 9
# 输出
result = fibonacci(n)
print(result)
# 结果:34
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.

4. 刷题资源

LeetCode 高频题

题目:Two Sum

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

代码实现:

def two_sum(nums, target):
    num_map = {}
    for i, num in enumerate(nums):
        complement = target - num
        if complement in num_map:
            return [num_map[complement], i]
        num_map[num] = i
    return []
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.

例题解析:
题目:在数组 [2, 7, 11, 15] 中找到和为 9 的两个数的下标。

# 输入
nums = [2, 7, 11, 15]
target = 9
# 输出
result = two_sum(nums, target)
print(result)
# 结果:[0, 1]
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.

5. 笔试面试题

字节跳动

题目:最大子序和

题目描述:
给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。

代码实现:

def max_sub_array(nums):
    max_sum = nums[0]
    current_sum = nums[0]
    for num in nums[1:]:
        current_sum = max(num, current_sum + num)
        max_sum = max(max_sum, current_sum)
    return max_sum
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.

例题解析:
题目:求数组 [-2,1,-3,4,-1,2,1,-5,4] 的最大子序和。

# 输入
nums = [-2,1,-3,4,-1,2,1,-5,4]
# 输出
result = max_sub_array(nums)
print(result)
# 结果:6
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.

以上是常见算法的介绍、部分算法题的解析与代码实现,以及典型的笔试面试题示例。希望这些内容能够帮助您更好地准备算法面试和笔试。