实习之路记录

自勉。进步。持续更新。

意向岗位:算法工程师、开发工程师、测试工程师

更新:想了想,觉得自己的论文,还有代码能力,创新能力稍弱,可能主攻开发工程师了

一、面经汇总:

1. 网易、滴滴、爱奇艺、平安科技、新浪    算法面经

实习面经分享_笔经面经_牛客网总结一下这几个月的面试吧。这一路走来确实不易。 面经主要公司是:网易+滴滴+爱奇艺+平安科技+新浪 网易 人工智能实习生 一面https://www.nowcoder.com/discuss/155532

2. 深信服、腾讯、字节    开发面经

日常实习面经_笔经面经_牛客网日常实习面经 深信服 岗位:C/C++软件开发 一面(65分钟) Linux进程调度算法主要有哪些?(FIFO、RR、CFS) 大多数进程采用哪种调度方式?CFS高优先级进程可以被抢https://www.nowcoder.com/discuss/354773?type=2&order=0&pos=12&page=1

3. C++ 面试基础总结

https://github.com/huihut/interviewhttps://github.com/huihut/interview

4. 机器学习面经

https://www.nowcoder.com/discuss/681294?type=post&order=recall&pos=&page=1&ncTraceId=&channel=-1&source_id=search_post_nctrackhttps://www.nowcoder.com/discuss/681294?type=post&order=recall&pos=&page=1&ncTraceId=&channel=-1&source_id=search_post_nctrack

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

二、知识点准备:

一些值得参考的链接:

C++基础知识大全_clw_18的博客-CSDN博客秋招基本尘埃落定了,打算总结一下C++学习路线的相关知识,今天是第一篇:C++基础知识总结。面向对象的三大特性:1、封装:把客观事物抽象为类,包含自己的属性和方法。2、继承:使用现有类的所有功能,在无需重新编写原有类的情况下对类的功能进行拓展。被继承的类成为父类或基类,继承的类成为子类或派生类。3、多态:一种形式,多种状态,分为静态多态和动态多态。静态多态指编译时多态,如函数重载、模板;动态多态指运行时多态,特指virtual虚函数机制形成的多态。类的访问权限:private、protectedhttps://blog.csdn.net/weixin_49199646/article/details/121066029

三、常见的手撕代码:

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节点来判断是都遍历??

猜你喜欢

转载自blog.csdn.net/candice5566/article/details/121666343