BAT面试算法基础学习笔记

本文主要介绍了在BAT(百度、阿里、腾讯)面试中常见的算法基础问题,涉及排序、字符串处理、栈和队列、链表、二分搜索、二叉树等多种数据结构和算法。详细讲解了各种问题的解题思路和优化方案,如合并有序数组、字符串替换、栈的特殊操作、链表调整和二分搜索的变种应用等,旨在帮助面试者提升算法能力。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

排序

归并排序, 改变有序区间(从1开始)

快速排序 {}3

堆排序 取出最大值存入数组

希尔排序 以距离值 跳跳比

桶排序

计数排序
身高

基数排序 个位数 序列 十位数 百位数

时间O(N*N)
冒泡 选择

O(N*logN)
快速

空间复杂度
O(1)
插入 选择 冒泡 堆排序 希尔排序

但是如果使用的是递归实现的,空间复杂度将不再是O(1),而是O(logN) 函数栈

OlgN-O(N)
快速

43335 快速不稳定
5115 希尔排序不稳定

快速排序:常量系数低

如果没有空间复杂度的限制,用哈希表实现
哈希表实现,时间复杂度为O(N),空间复杂度为O(N)

O(1)
先排序

合并有序数组

从后往前拷贝,避免原有的数据被覆盖,比较和拷贝

荷兰国旗问题

看当前数
|

{} 1 1 0 0 2 1 1 0 {}
0区 2区

查找矩阵中的有序数

数组右上角开始

需要排序的最短子数组的长度

【1,5,4,3,2,6,7】
返回4 【5,4,3,2】
方法:从左往右记录遍历过的最大值位置,会发生一种情况,当前的元素比右边的数大,记录这种情况的最右边的位置
在从右往左,同理
最后最小和最大的位置区间就是要进行排序的区间长度。

数组中的最大差值

例如某数组排序之后为
1 2 3 4 7 8 9

最大差值来自于4和7,所以返回3

思想来自于桶排序

遍历数组

最小 最大 N区间 元素个数
N+1 为最大值
构造空桶
空桶区间 的最大差值即为最大差值

字符串

  1. 广泛性
    1.1 字符串数组 查找 排序
    1.2 字符串对象

  2. 需要掌握的概率

    • 回文
    • 子串(连续)
    • 子序列(不连续)
    • 前缀树
    • 后缀树和后缀数组
    • 匹配
    • 字典序
  3. 需要掌握的操作

    • 与数组有关的操作:增删改查
    • 字符串替换
    • 字符串的旋转

字符串题目的常见类型

  1. 规则判断

    • 判断字符串符合整数规则
    • 判断字符串符合浮点数规则
    • 判断字符串符合回文数规则 TRUE or false
  2. 数字运算

    int 和long 类型表达整数范围有限,所以经常用字符串实现大整数

    与大整数相关的加减乘除操作,需要模拟笔算的过程

  3. 与数组有关的排序有关类型

    • 排序
  4. 字符计数

    • 哈希表
    • 固定长度的数组
      C/C++ 字符256 java 65536

    • 滑动窗口问题、寻找无重复字符串子串问题、
      计算变位词问题

  5. 动态规划问题

    • 最大子串长度问题
    • 最大回文子序列
    • 最长公共子串
    • 最长公共子序列
  6. 搜索类型

    • 宽度优先搜索
    • 深度优先搜索
  7. 高级算法与数据结构解决的问题

    • Manacher算法解决最长回文子串问题
    • KMP 算法解决字符串匹配问题
    • 前缀树结构
    • 后缀树和后缀数组

比较两棵树,T1中包含T2的子树,返回TRUE,否则返回false

方法1,遍历二叉树+判断匹配 O(N*M)

方法2:二叉树序列化+ KMP算法 O(M+N)

实际为KMP比较字符串

变形词
str1=“123” str2=”231” 返回TRUE

str1=“123” str2=”2331” 返回False

方法:使用哈希表 str1 str2 判断记录是否一致
可以借用数组

旋转词

  1. 判断str1 与str2 是否相等
  2. 如果相等,生成str1+str1的大字符串
  3. KMP算法判断是否含有str2

str1=“1 2 3 4”
str1+str1=“ 1 2 3 4 1 2 3 4”

穷举了所有的旋转词

单词间逆序

  1. 实现将字符串逆序的函数f
  2. 利用f将字符串所有字符逆序
    “pig loves dog”->”god sevol gip“
  3. 找到逆序后的字符串中每一个单词的区域,利用f将每一个单词的区域逆序
    “god sevol gip”->”dog loves pig”

一个字符串str,和一个整数i,i代表str中的位置,将str[0..i]移动到右侧,str[i+1..N-1] 移到左侧

str=”ABCDE” ,i=2. 将str调整为“DEABC”
要求,时间复杂度为O(N),额外空间复杂度为O(1)

原地调整
分为两步
1. 将str[0..i] 部分的字符逆序
A B C D E

C B A D E

  1. 将str[i+1~N-1] 部分的字符串
    C B A D E

C B A E D

  1. 将str整体的字符逆序
    C B  A E D
    D E A B C

活用局部逆序函数

 拼接字符串,返回字典序列最小的

strs=[“abc”, “de”];
abcde deabc 返回abcde

strs==[“b”,”ba”]
bab bba 返回bab

O(N*logN)
实质是排序

如果str1+str2

空格替换 “%20”

长度变化的规律,从后往前拷贝

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值