面试经验-小鹏技术面
前言处女面,可能因为有实习经历所以拷打项目非常多,手撕有惊无险。
内容自我介绍
Q. 介绍一下自己
A. 学校背景,吸取上次经验,先简要介绍实习经历,看看对面反应
介绍过程有持续反应,看来是懂技术懂业务的
业务内容介绍
Q. 我对你的项目还是不太熟悉,先介绍一下背景和过程中遇到的问题刚才介绍太短了,忘记把背景加入进去了,面试官给了一次机会
A. 介绍项目背景,根据要求,做了一个基于知识框架和知识图谱构建的智慧学习平台,通过知识绑定能够串联起来学习过程,通过 LangChain 能够将死知识变成活知识。
A. 首先是 WebRTC,我之前是做 RTMP、RTP 这块的,我们项目中又需要 WebRTC,这里应该补充:所以我快速学习了这方面的知识,我做了架构演进,提升了多少。
A. 然后就是 ShareDB 这块,就像是一块白板,上面储存了许多共享变量,如果大家都想修改它,就会引发冲突;因为我们之前做的是 Socket.io,如果想要加多个节点,就会出现问题。因为 Socket.io 需要 Http 长轮询,我印象中是 200 200 201 三个响应。如果做 LoadBalance,那 ...
LC-day-15-更快更好的回溯
前言在做回溯时,常常遇到需要去重的情况,以及各种各样的条件限制。
万变不离其宗,只需要在回溯的 for 循环中第一行加入判断条件即可。
去重排序去重子集去重
1234567891011121314151617181920212223class Solution { private List<List<Integer>> res = new ArrayList<>(); private LinkedList<Integer> path = new LinkedList<>(); public List<List<Integer>> subsetsWithDup(int[] nums) { // 对其进行排序 Arrays.sort(nums); backtrack(nums, 0); return res; } private void backtrack(int[] nums, int s ...
LC-day-14-回溯与剪枝
前言回溯和动态规划是我最害怕的算法,这次我要直面恐惧
架构
主函数调用回溯函数
不递归传递结果,直接记录到全局变量中
做 - 递归 - 回撤 这个逻辑放到 for 循环中
例子找出所有相加之和为 n 的 k 个数的组合,且满足下列条件:
只使用数字 1 到 9每个数字 最多使用一次返回 所有可能的有效组合的列表 。该列表不能包含相同的组合两次,组合可以以任何顺序返回。
1234567891011121314151617181920212223242526272829303132333435class Solution { // 结果和过程直接放到全局,不用考虑递归时的传递 private List<List<Integer>> res = new ArrayList<>(); private LinkedList<Integer> path = new LinkedList<>(); // 主函数只用调用一次回溯即可 public List<List<Integer> ...
面试经验-上汽数字化产品交付-OC
前言人生第一次求职面试,形式是电话面,持续时间 16 分钟。
开场白
以为面试官是 HR,说了 HR 您好。面试官说自己是负责部门业务的,那就是技术面了。
看到你的当前实习经历内容非常丰富,感觉比较适合我们岗位。
内容自我介绍
Q. 介绍一下你自己
A. 首先介绍了学校背景,然后根据开场白重点介绍了我现在的实习工作。
说着说着多说了点实习内容,听着面试官没怎么回应了,直接转向自己的一些优点:
学习和适应能力强,迅速结束介绍。
从这里我能感觉到,面试官不太在意太深入的项目细节,那就可以转换思路,从做出的工作成果方面下手。
实习经历
Q. 这个超长时间的实习,为什么要在里面实习,你在里面主要负责些什么。
A. 首先介绍实习背景,老师把我放在这个课题中,(刚才优点说的有点少了,在此补充)以及导师为什么让我负责一整个模块,突出业务能力强。
项目经历
Q. 介绍一下你的 2023 年 - 2024 年的一个简历中的项目,介绍内容。
A. 不清楚是哪个,请您提示我一下。
Q. 一个 Unity 项目,因为我们智能座舱有用到该技术,介绍一下。
A. 原来是毕业设计,轻松介绍了。
首先从技术栈 ...
LC-day-10-二叉树的遍历
前言二叉树算是比较简单的数据类型,也是常用的数据类型。
二叉树有多种遍历方式,前序、中序、后序、层序遍历。
中序和层序遍历写起来有些不同,记录一下。
前三种遍历都可以借助栈实现迭代遍历,不用递归。
层序遍历则可以借助队列。
前序遍历遵循 中-左-右 方式输出
123456789101112131415161718public List<Integer> preorderTraversal(TreeNode root) { if(root == null){ return new ArrayList<>(); } Stack<TreeNode> stack = new Stack<>(); List<Integer> res = new ArrayList<>(); stack.push(root); while(!stack.isEmpty()){ TreeNode node = stack.pop(); ...
LC-day-09-单调队列与优先级队列
前言第一次遇见这种数据结构,记录一下。
比如:滑动窗口和高频元素,这两个题我觉得都挺接地气。
滑动窗口这题主要是获取每个窗口中的最大数并记录,和时序有关。
高频元素就像是 top-k或者 tfidf,都有其实用场景。
实现单调递减队列单调队列有着巧妙的插入方式。
插入: 如果插入的比末尾数大,就向前清理,维护递减序列
弹出: 如果弹出的是头部数(也就是最大的那个),就正常弹出,其他的忽略
由于维护了有序性,所以弹出的时候不可能出现弹出数比当前数更大的情况,其他的都被最大的那个删掉了,所以其他的可以忽略。
1234567891011121314151617181920212223242526class MyQueue{ Deque<Integer> deque = new LinkedList<>(); /** * 如果删除的是头部数,弹出,其他的不用管 */ void poll(int num){ if(!deque.isEmpty() && num == deque.pee ...
LC day-07 字符串匹配
前言现在才想起大二算法课的良苦用心,秋招还得再捡起来。
KMP 一直是老大难问题,实际上就是一个 next 数组求法。
Next 数组为什么要有这个东西? 方便快速跳过相同前缀,不用匹配到一半发现不对又回去从头重新匹配。
所以 next 是指,匹配失败了,下一个找前面的谁。
比如下面两个字符串比较:
aafaabaafaab
aabaaf
求出 aabaaf 的 最大匹配前后缀数组:[0, 1, 0, 1, 2, 0]
全部 -1 得到 next 数组:[-1, 0, -1, -1, 1, -1]
涉及到一个求 next 数组的算法:
12345678910111213141516171819202122private int[] next(String s){ int[] next = new int[s.length()]; int j = -1; next[0] = j; for(int i = 1; i < next.length; i++){ // 0 已经设置好了 while(j >= 0 && s.charAt ...
ShareDB 文档共享代替 Socket.io 复杂信令交互
前言Socket.io 实际上有点过于底层了,大量的消息交互都需要人工手写,复用性也不强。
为什么 ShareDB 这种做腾讯文档的能够用来做消息传输呢,其原理和 Socket.io 一样,都是用了 WebSocket 连接来进行双工通信。
我们的需求是建立一个共享区域,多个设备使用同一账号登入,此时协作修改会引发操作冲突。
如果仅使用纯消息传输方式,如 手机-发送修改->Socket Server=广播修改=》其他设备,会产生一些问题:
如果手机和电脑操作了同一块上下文,使用谁的修改?
如果多人同时操作了同一块上下文,操作如何合并?
如果操作之间有冲突,怎么解决冲突?
ShareDB 使用 OT 解决了这一问题,OT 是 Operational transformation 的简称,是一种在高级协作软件系统中支持一系列协作功能的技术。OT 最初是为了在纯文本文档的协作编辑中保持一致性和并发控制而发明的。
这种保证最终数据一致性和并发控制的协作控制机制能够应用到更广的范围。
设计最初使用 Socket.io 的场景就是 WebRTC 直播服务的流媒体更新通信和房间管理,这些存 ...
微服务初探
前言生产力就是王道,谁能够更短时间做出更多工作,谁就能胜利。
保障生产力持续在线的最佳方案就是:将琐事交给工作流
需求搭建一个在线小说阅读编写网站
功能如下:
实现登录、注册
实现小说编写、阅读、查询、收藏
实现评论查看、发布
依赖如下:
使用 SpringBoot、Vue 框架,实现前后端分离
使用 Spring Cloud 构建微服务
技术要点业务逻辑明确、简单,不做赘述,我们讲讲微服务。
什么是微服务我们在没有接触技术之前,或仅仅道听途说,很容易产生畏难心理。
实际上,微服务就是把我们具有多种功能的单体服务,拆分成内聚性强的个体,方便解耦。
就拿我们的项目举例,用户登录注册逻辑连贯,共享用户表格,可以拆分。
又如评论模块,尽管使用了用户模块的 ID、小说模块的 ID,但其功能独立,可以拆分。
这样我们通过拆分,就得到了多个服务,每个服务放到一个服务器上,这样就能将原本的单体服务高压力,分散到多个服务器上,从而提升服务可用性。
服务注册与发现如果是单体服务,我们在前端只需注明它的 IP 地址就好了,但是微服务有多个 IP 地址,我们怎么管理?
如果我们没法预知服务器 IP, ...
webRTC 开发工作总结
前言在接手项目时,前端开发人员已经编写了基于 Peer.js 和 Socket.io 的单点连线直播间。
这对于我后续的开发来说,是引导,也是桎梏。
成果按时间顺序排序
成果名
优先级
耗时
产出物
评价
前端直播应用(单网页)
极高
无
直播主和观众两个页面
前端开发人员已完成的 demo
— 我在此时加入团队,并进行了方案变更 —
基于 srs 的媒体流服务器
低短
极长
部署文档
项目本身没有选择的技术栈,从当前的收益来看是值得的
前端直播应用(适配 srs)
极高
中等
多个直播相关页面
项目模块化的基础
— srs 项目改造初步完成 —
前端推拉流 sdk
高
短
sdk 项目
实用,且一直沿用
前端链接、媒体与信令管理工具包
极高
极长
三个工具类
非常实用,但是尝试多次打包到 sdk 中均未成功
— 项目管理级 —
录播与点播
高
中等
一个回调服务器、部署文档
实际效果不佳,技术选型限制了此部分的发挥
模块化组件
中
短
多个最小可用组件
模块化进程进展又快又好
— 项目模块化完成 —
项目集成 ...