Skip to content

Latest commit

 

History

History
416 lines (295 loc) · 24.6 KB

File metadata and controls

416 lines (295 loc) · 24.6 KB

Algorithm

本页面用于记录个人的刷题笔记(尤其是那些有启发,有趣的编程题)。部分附个人面试公司, 主要根据题型分类(跨题型随机分类2333)。

二叉树

排序

链表&堆&栈&队列

字符串

  • 如何找出一个字符串中的最大不重复子串(蜻蜓FM/美团/Wish/字节跳动)

    • 滑动窗口 --> 滑动窗口直到最后一个元素,每当碰到重复时(可用一个Map记录,表示字母和位置),左指针往后走至当前位置,每轮都进行比较,取最大长度。 / 时间复杂度 --> O(n)
    • 3. 无重复字符的最长子串
  • 给定一个数,删除K位得到最大值(Unity)

  • 至多包含 K 个不同字符的最长子串

  • 字符串的排列

    • 深度优先搜索(DFS) + 剪枝
    • 理解递归的构造过程 --> 每次固定一个字符,继续处理剩余字符
    • 处理后还原交换(保证所有可能都被遍历到)
    • 面试题38. 字符串的排列
    • 46. 全排列 (相同思路)
  • 至少有K个重复字符的最长子串

    • 分治法,递归求解
    • 用一个map计数,一个set存储不应该包含的字母(即 count < k)
    • 双指针遍历字符串,一旦找到需要剔除的字符,判断该字符左右两边满足条件的最长子串,比较返回较大值
    • 395. 至少有K个重复字符的最长子串

递归&回溯

动态规划

设计模式

  • 实现一个线程安全的单例模式(星环/阿里)

    • 懒汉模式 --> Lazy初始化
    • 饿汉模式 --> 在方法调用前,实例就已经创建好了
    • 全部 sychronized 锁住 --> 可以保证线程安全,但销效率低
    • “双重检查锁” 机制版本 (面试用,注意 getInstance() 方法 和对应 instance 实例 都需要 static 关键字修饰)
      • volatile 来保证其线程间的可见性,禁止指令重排序,保证返回的是初始化完全的对象,详见 Why is volatile used in double checked locking
      • 同步代码块中使用二次检查,以保证其不被重复实例化
    • 枚举enum和静态代码块的特性相似,在使用枚举时,构造方法会被自动调用,利用这一特性也可以实现单例(面试也可稍微提及)
    • 高并发下线程安全的单例模式(最全最经典) (单例的N种实现)
    • 单例模式(详尽介绍)
  • 设计一个方案,提供不同算法调用接口(参数即为需要调用的方法名)(PayPal)

    • 这题感觉非常开放,当时答了用 适配器模式,似乎面试官并不是特别满意,适配器模式 属于结构型模式,主要用于解决兼容性问题,实际此题还是以如何创建为主,用 工厂模式 为宜
  • 设计一个方案,传入一个类型(如 圆形,矩形,三角形等),求对应的周长和面积,能用设计模式更好(字节跳动)

  • (项目相关)个人项目的查询引擎设置 AbstractProvider 这种抽象类用到了什么模式(星环)

    • 模板模式(Template Pattern)
    • 提取通用方法,便于维护 / 封装不变部分,扩展可变部分

数据库设计&SQL

  • 设计一个表结构,用于记录高考之后学生的成绩,以及写一个查询得到某个城市的理科前十名(字节跳动)

    • 具体题意忘了,limit 即可筛出前n条,但原意应该不止如此
  • 设计一个消息分发系统的表结构,需要满足 1.对某个用户发消息 2.对某类用户发消息 3.对所有用户发消息 (字节跳动)

  • 找出在表A中但不在表B中的记录(根据某一个共同的column)(PayPal)

其他