实习之路记录 |
您所在的位置:网站首页 › 新浪算法面经 › 实习之路记录 |
自勉。进步。持续更新。 意向岗位:算法工程师、开发工程师、测试工程师 更新:想了想,觉得自己的论文,还有代码能力,创新能力稍弱,可能主攻开发工程师了 一、面经汇总: 1. 网易、滴滴、爱奇艺、平安科技、新浪 算法面经实习面经分享_笔经面经_牛客网总结一下这几个月的面试吧。这一路走来确实不易。 面经主要公司是:网易+滴滴+爱奇艺+平安科技+新浪 网易 人工智能实习生 一面 日常实习面经_笔经面经_牛客网日常实习面经 深信服 岗位:C/C++软件开发 一面(65分钟) Linux进程调度算法主要有哪些?(FIFO、RR、CFS) 大多数进程采用哪种调度方式?CFS高优先级进程可以被抢 https://github.com/huihut/interview https://www.nowcoder.com/discuss/681294?type=post&order=recall&pos=&page=1&ncTraceId=&channel=-1&source_id=search_post_nctrack ![]() ![]() C++基础知识大全_clw_18的博客-CSDN博客秋招基本尘埃落定了,打算总结一下C++学习路线的相关知识,今天是第一篇:C++基础知识总结。面向对象的三大特性:1、封装:把客观事物抽象为类,包含自己的属性和方法。2、继承:使用现有类的所有功能,在无需重新编写原有类的情况下对类的功能进行拓展。被继承的类成为父类或基类,继承的类成为子类或派生类。3、多态:一种形式,多种状态,分为静态多态和动态多态。静态多态指编译时多态,如函数重载、模板;动态多态指运行时多态,特指virtual虚函数机制形成的多态。类的访问权限:private、protected 树的前序遍历、中序遍历、后序遍历详解 参考解法:力扣 这几道题都有一个递归版的解法,类似,难点主要是递归如何实现,怎么理解递归: 对于递归有没有什么好的理解方法? - 知乎 递归解法比较简单: 先序 # 方法一 递归解法 前序后序中序都是相同的套路 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节点来判断是都遍历?? |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |