自勉。进步。持续更新。
意向岗位:算法工程师、开发工程师、测试工程师
更新:想了想,觉得自己的论文,还有代码能力,创新能力稍弱,可能主攻开发工程师了
一、面经汇总:
1. 网易、滴滴、爱奇艺、平安科技、新浪 算法面经
2. 深信服、腾讯、字节 开发面经
3. C++ 面试基础总结
https://github.com/huihut/interviewhttps://github.com/huihut/interview
4. 机器学习面经
5. 开发工程师面经
秋招总结 | 来听听我秋招放弃算法转向开发的经验历程~_猿生活_牛客网一、序言 作为一名2022届应届硕士毕业生参与了一场惨烈的秋招战斗,所幸本人战斗的结果还可以,最终签约北京美团,岗位是后端开发,现来总结秋招历程,反馈牛客!这里值得注意的是,本人是从算法赛道转到开发
https://www.nowcoder.com/discuss/800771?type=post&order=recall&pos=&page=1&ncTraceId=&channel=-1&source_id=search_post_nctrack&gio_id=5CAC797530CD1CD6C46DB34B2C90DF19-1638439541538
6. C++面试总结
C++后台:从实习到秋招的总结(已签腾讯微信)_笔经面经_牛客网这是我实习到秋招的笔记资料 链接: https://pan.baidu.com/s/1p3K6VILrMexeb8ciCRitdQ 提取码:zsu6 虽然内容会因为本人字
https://www.nowcoder.com/discuss/586944?type=post&order=jing&pos=&page=2&ncTraceId=&channel=-1&source_id=search_post_nctrack&gio_id=5CAC797530CD1CD6C46DB34B2C90DF19-1638454215367
二、知识点准备:
一些值得参考的链接:
三、常见的手撕代码:
1. 二叉树的遍历
这几道题都有一个递归版的解法,类似,难点主要是递归如何实现,怎么理解递归:
递归解法比较简单:
先序
# 方法一 递归解法 前序后序中序都是相同的套路
class Solution:
def preorderTraversal(self, root: TreeNode) -> List[int]:
def preorder(root: TreeNode):
# 结束条件:节点为null,则结束
if not root:
return
# 遍历根节点
res.append(root.val)
# 遍历
preorder(root.left)
preorder(root.right)
res = list()
preorder(root)
return res
# 时间复杂度:O(n),其中 n 是二叉树的节点数。每一个节点恰好被遍历一次
# 空间复杂度:O(n),为递归过程中栈的开销,平均情况下为 O(\log n),最坏情况下树呈现链状,为 O(n)。
中序
# 方法一 递归法
class Solution:
def inorderTraversal(self, root: TreeNode) -> List[int]:
def inorder(root: TreeNode):
if not root:
return
# 先遍历左子树
inorder(root.left)
# 根节点
res.append(root.val)
# 遍历右子树
inorder(root.right)
res = list()
inorder(root)
return res
后序
# 解法一 递归法
class Solution:
def postorderTraversal(self, root: TreeNode) -> List[int]:
def postorder(root:TreeNode):
if not root:
return
postorder(root.left)
postorder(root.right)
res.append(root.val)
res = list()
postorder(root)
return res
迭代解法:
递归的时候隐式地维护了一个栈,而在迭代的时候需要显式地将这个栈模拟出来。这个难度比递归要难一些
前序:
# 方法二 迭代解法
# 使用栈来递归
# https://www.bilibili.com/video/BV1dA411L7Mj 这个up讲得太好了!!!一下子明白了
# 1. 初始化栈,将根节点入栈
# 2. 当栈不为空时:
# 弹出栈顶元素 node,并将值添加到结果中;
# 如果 node 的右子树非空,将右子树入栈;
# 如果 node 的左子树非空,将左子树入栈
class Solution:
def preorderTraversal(self, root: TreeNode) -> List[int]:
# 特例判断
if not root:
return
# 把根节点压入栈中
stack = [root]
# 结果列表
ans = []
# 当栈不为空,也就是树还没遍历完
while stack:
# 弹出栈顶元素
node = stack.pop()
ans.append(node.val)
# 先把右子树压进去,先进后出
if node.right:
stack.append(node.right)
if node.left:
stack.append(node.left)
return ans
中序
# 方法二 迭代法 使用一个固定的模板
class Solution:
def inorderTraversal(self, root: TreeNode) -> List[int]:
if not root:
return []
ans = []
# 都是要先把根节点压进去
cur, stack = root, []
# 只要当前节点或者栈有一个不是空就继续遍历
while cur or stack:
while cur:
# cur 入栈
stack.append(cur)
# 找到当前最左端的孩子
cur = cur.left
# 弹出栈顶元素
tmp = stack.pop()
# 加入结果
ans.append(tmp.val)
# 弹出栈中叶节点的父节点,当左子树完全遍历完就会遍历右子树
cur = tmp.right
后序没搞懂,需要一个pre节点来判断是都遍历??