Skip to content

SimonKennethRobo/PnC-Interview-Coding

Repository files navigation

PnC Interview Coding

[toc]

规划控制相关岗位高频代码题整理与参考答案。

建议刷题顺序:LeetCode Hot 100 -> 代码随想录 -> 剑指 offer。

使用说明

header.hpp中已包含刷题常用的头文件和命名空间,实现了一些常用的数据结构和算法。 在 .vscode中已经配置好了基于 clang 的 vscode 调试环境和快捷命令, 输入 lcsol并回车即可生成一个新的 leetcode 答题模板。

  • 清理 clang 编译文件: python clean.py
  • 统计代码文件与行数: bash ./count.sh

自动驾驶公司特别喜欢考察动态规划和、二叉树和图论的题目,可重点准备。

Array

打印类

区间类

  • 56[M]. 合并区间. 按照左端点排序,遍历所有区间根据规则判断是否和上一个合并
  • 57[M]. 插入区间. 不断取区间和给定区间的并集,直到新区间和原区间断开(也就是 right < li)的时候将新区间插入
  • 435[M].无重叠区间. 本质和 300.最长上升子序列一样。动态规划,等价于选择数量最多的互不重叠的区间, dp[i]表示以第 i 个区间结束不重叠的最大区间数量

二分法

回溯法

  • 46[M]. 全排列. 递归回溯, 直接操作原数组,分成左右两半,遍历每一位数字,每次把当前数字交换到 idx 处,相当于固定开头,不重复地组合剩余的数字
  • 77[M]. 组合. 递归回溯。
  • 86[M]. N 皇后问题. 回溯法,注意回溯时的状态恢复。注意分析递推条件:列不被占用、左上方不被占用、右上方不被占用。对角线的判断可以用行号和列号之差/和来表示

前缀和/差分数组

其他

DP

题型总结:简单递推;加判断;加 min/max;加边界条件; 分情况讨论

1 路径/矩阵问题

2 背包问题

本质是约束优化问题或线性规划问题。

0-1 背包

  • Kama 46. 携带研究材料. dp[i][j]表示第 i 个物品放到容量为 j 的背包里的最大收益,外层遍历物品,内层遍历容量。注意只放第一个物品时的初始化。
  • 总预算为 G,共 M 个候选人,给第 i 个人 Ci 的预算能够产生 Vi 的收益,求可能最大的收益(动态规划): dp[j],表示容量为 j 的背包所能获得的最大收益。外层遍历人头,内层遍历预算

    进阶:如果 Ci 和 Vi 的关系不是一个固定关系,而是可变的映射,如何解决(没有完整思路,只回答可以采用一些带约束的离散优化算法解决)

完全背包

  • 322[M].零钱兑换。动态规划,从 0 开始攒总金额,每一步能凑的钱都基于上一步,看这次用什么面值的硬币。设硬币面值为 c_j,F(i)为凑成面值 i 所需的最小硬币数,则状态转移方程为
  • 518[M].零点兑换 2️

多重背包

3 子序列问题

不连续子序列

  • 300[M].最长递增子序列。dp[i]=max(dp[i],dp[j]+1), dp[i]为考虑前 i 个元素,以第 i 个数字结尾的最长上升子序列的长度。遍历每个 i 结尾的所有子序列。注意初始化为 1
  • 673[M].最长递增子序列的个数
  • 1143[M].最长公共子序列。dp[i][j] 表示 text 1[0:i] 和 text2[0:j] 的最长公共子序列的长度。
  • 583[M].两个字符串的删除操作。1143 的变种。可以先找最长公共子序列,然后比较两个串的删除次数谁更少。或者可以直接 dp,dp[i][j]表示到串 1 的 i 和串 2 的 j 为止,删除所需的最小次数,递推时判断字符是否相等,如果相等直接递归到子串;否则看删除哪一个串的字符,然后从中找次数最少的
  • 718[M].最长重复子数组。dp[i][j] 表示 A[i:] 和 B[j:] 的最长公共前缀,答案为所有 dp[i][j]中的最大值。如果 A[i] == B[j], dp[i][j] = dp[i -1][j - 1] + 1,否则为 0。i/j 为 0 时单独处理
  • 343[M].整数拆分。dp[i]表示把数字 i 拆解后的最大成乘积,状态转移在不拆、只拆一次和递归拆分中最大的
  • 115[H].不同的子序列。dp[i][j] 表示在 s[i:] 的子序列中 t[j:] 出现的个数,倒序递推
  • 42[H].接雨水。DP:第一次遍历找到每个位置左边的最大值,第二次遍历找到每个位置右边的最大值,然后再遍历一次计算每个位置的接雨水量。找最大值的时候用动态转移。也可以用双指针
  • 1035[M].不相交的线。本质和 1143 一模一样

连续子序列

字符串/回文

  • 32[H].最长有效括号。DP,dp[i] 表示以下标 i 字符结尾的最长有效括号的长度; 或者用栈(推荐)匹配括号,每次更新长度
  • 516[M].最长回文子串。dp(i,j) 表示字符串 s 的第 i 到 j 个字母组成的串是否为回文串, 初始化单个字符是回文,枚举字符串长度,判断 i...j 之间是否是回文。转移时判断当前字符是否相同,若相同则长度是子串+2,否则从让步的两种方式里选最大的。注意外层从
  • 647[M].回文子串。中心拓展法,枚举每一个可能的回文中心,然后双指针左右拓展。或者用 DP[i][j],枚举子串长度,注意 i 倒着遍历,j 正着遍历
  • 97[M].交错字符串。dp[i][j]表示 s1 的前 i 个和 s2 的前 j 个能否凑成 s3 的 i+j 个。dp 向后递推,考虑 s1 的前 i-1 和 s2 的前 j 能否凑成 s3 的 i-1+j,s2 同理。 注意初始化方式

4 股票问题

5 打家劫舍

  • 198[M].打家劫舍. dp[i]表示到第 i 间屋子的最大金额,考虑拿这一家+上 2 家还是还是上一家
  • 213[M].打家劫舍 II. 思路沿用 198,由于首尾相连,不能同时偷第一家和最后一家,因此对下标范围进行两种特殊讨论即可,然后取最大的。

Geometry

  • 判断点是否在三角形内部: 三个向量叉乘判断符号,如果是同号(同正或者同负),则在三角形内部
  • 判断多边形凹凸性
  • 手撕凸包计算
  • 判断两条直线是否相交
  • 计算一个点到一条直线的距离

Graph

Hashtable

LinkList

  • 21[E]. 合并两个有序链表
  • 206[E].反转链表. 利用栈或头插法,务必注意哑节点的使用和边界条件
  • 92[M]. 反转链表 II. 切断后反转再重连。或者一次取三个节点,不断把下一个节点插到开头。
  • 19[M]. 删除链表的倒数第 N 个结点. 利用栈或双指针(快慢指针)
  • 141[E]. 环形链表. 用哈希表来存储所有已经访问过的节点。每次我们到达一个节点,如果该节点已经存在于哈希表中,则说明该链表是环形链表,否则就将该节点加入哈希表中。重复这一过程
  • 328[M]. 奇偶链表. 直接写就完事了,应该算 E 的。注意保存 even_head,偶数更快到 null,因此要作为 while 的结束条件
  • 147[M].对链表进行插入排序. 链表分为有序和乱序,用当前节点遍历前面的有序链表,找到合适的插入位置。注意储存有序链表的末尾,并更新有序链表末尾节点的下一个节点
  • 148[M].排序链表. 147 的升级,要求时间复杂度达到 O logn. 用归并的思想递归切分子链表,再合并有序链表

StackQueue

String

Tree

Greedy

  • 860[E].柠檬水找零. 分类讨论+贪心,注意收 20 找零时的顺序,先找 10+5 再找 5x3. 如何用 RL 解?定义 MDP 模型:观测是收的钱,状态是已有的钱,动作是找的钱(5 元和 10 元数量,离散空间),奖励是是否成功找零。可以直接用基于表格的 Q-learning 算法求解,也可以用基于神经网络的 DQN 求解。
  • 2087[M].网格图中机器人回家的最小代价。由于上下和左右走代价一样,因此不需要 BFS,直接走就行了,先走到家所在行,再走列,累计路上的代价。
  • 55[M].跳跃游戏。遍历每个元素,维护当前下标能到达的最远下标,如果当前下标超过了最远下标,说明无法到达,返回 false。如果最远下标超过了数组长度,说明可以到达,返回 true。
  • 45[M].跳跃游戏 2
  • 674[E].最长连续递增序列。贪心法

Double Pointer

NumercialComputation

  • 7[M]. 整数反转
  • 50[M]. Pow(x, n). 递归计算. 注意用 long long 存一下 n。注意区分 n 为奇数和偶数的情况,奇数时要多乘一个 x
  • 69[E]. x 的平方根
  • 寻找二次曲线(离散点构成)最小值, 同力扣 162
  • 已知 lnx+x^2 =0 在(0,1)范围内有唯一解,用数值方法求解,精度 0.0001
  • 写一个四元数转 translation 的代码
  • abs(x – sqrt(A)) < m,A,m 都给了,让求最大的 x,不允许调用数学库
  • 手撕矩阵乘法
  • 求矩阵行列式

SortSearch

  • 快速排序, 包括非递归版本
  • 归并排序
  • 归并排序求逆序对个数,并记录每个元素对应的逆序对个数
  • 实现一个堆排序

Machine Learning

  • 手撕 kmeans
  • 手撕矩阵乘法
  • 手撕卷积
  • 手撕 multi head attention
  • 手撕 transformer layer
  • 手撕 iou
  • 手撕 nms
  • 手撕 focal loss
  • 手撕 deformable conv

Image Processing

  • 33 的卷积核去卷积 128128 的图片,现在有 64 路运算单元可以并行,怎样运算可以提高效率。

    将 128128 切成 1616 个 patch(共 64 个)patch,每个单元计算一个 patch 的卷积,最后合并结果

  • 有一个电机可以控制相机移动,相机拍着一个标定板,移动电机找到相机清晰度最高的位置,设计算法实现。

OS

  • 手撕多线程
  • 写一段多线程访问 shared_ptr 对象会出现问题的代码

Event Simulation

Others

  • 手撕 unique_ptr

  • 手撕 shared_ptr

  • 手撕一个 vector. 注意扩容机制

  • 手撕二分查找

  • 找出数组中是否可以实现一半数字和等于另外一半

  • 手写类的继承

  • 类中实现均值滤波

  • 1-26 代表‘A’~‘B’,27 代表‘AA’,28 代表‘AB’,以此类推,给一个整数,输出他表示的字符串。

  • 手撕单例模式

  • 手撕优先级队列(不准用容器)

  • 给一个 01 串,保证开头为 0,结尾为 1,找到任意一个“01”子串的位置,复杂度尽可能低

  • 无向图,给定两节点 a,b,求路径必会经过 a 和 b 的节点对数(分别断开 a 和 b 进行容斥)

  • n 个洞一排,兔子每天往左或右跳一格,每天询问一个洞里是否有兔子,找到一个一定能找出兔子的策略(顺着问一遍再反着问一遍,奇偶性错开)

  • 元戎独创 1

    Alice 和 Bob 两个人正在玩游戏,轮流操作. Alice 先手. 给定一个非严格递增的非负整数的数组, 每次操作选择一个区间[l,r]全部减一. 条件 1:操作后的数组还是满足非严格递增 条件 2:当数组元素全为 0,则判定失败. 问谁胜利? 输入一个正整数 n, 接下来输入 n 个元素,表示数组内容. 样例: 3 1 1 1 输出:Alice 胜 2 0 2 输出:Bob 胜

  • 元戎独创 2

    把数组转化为差分数组. 区间-1 操作,即变成选定下标[i,j] a[i]-1, a[j]+1,全部元素为 0 则失败 用石头的角度来看,对于第 i 堆的每个石头,可以移动 1,2,3,...n+1-i 次. 那么问题就转化成了经典 nim 博弈. ans = 0; a[i]的石头数是奇数,ans^= n+1-i;//a[i]是已经是差分数组了. 最终 ans 为 0,则先手必败,反之,先手必胜.

  • 元戎独创 3

    给定 n,m.其中 n<=1e6, m <=1000 给定一个 n 个元素的非负整数数组,问该数组是否存在一个非空序列,满足序列中的元素之和是 m 的倍数. 样例: 3 5 5 5 5 输出:YES

智力题

  • 1000 桶水有一桶有毒,一头猪喝了有毒的水之后过 15 分钟会死掉,问最少需要多少头猪来找到有毒的水,在一个小时之内?

  • 一块蛋糕切 n 刀最多切几块

    $$ \frac{n(n+1)}{2} + 1 $$

  • A,B,C 三个角色,C 告诉 B 生日日期,告诉 A 生日月份,给 10 个日期选项与一些条件,推理 C 的生日是哪一天。

概率论

  • 2 人抛硬币,正面赢,反面让另一个人抛,求先抛的人获胜的概率? 设 $$ p=\frac{1}{2} \times 1+\frac{1}{2} \times(1-p) \Rightarrow p=\frac{2}{3} $$
  • 抛硬币,连续两次正面向上为止,求次数期望
  • 三个门,门后一个有礼物,你选了一个,帮你排除了一个没有礼物的门,问你换不换
  • n 个人,其中一个是明星其余为普通人,明星不认识普通人,普通人都认识明星,普通人之间是否认识未知。现给一个黑盒,可以询问一次 A 是否认识 B,问使用黑盒几次能找到明星?

About

规划控制相关岗位高频代码题整理与参考答案

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors

Languages