急急急!数据结构用两个栈实现学生作业优先级操作,把新来的作业插入到适当位置使顺序表成为有序表

大家好这是一篇超长面经+总结,是对自己上一阶段的梳理也希望给以后准备找工作/正在找工作的同学们多多少少一点帮助。

基本介绍:普通985本+海外渣硕大二转到CS专業,大三项目交流3+219年10月留学毕业,有工程项目无实习无额外加分项,主Java研发岗非battmd级别选手,加一起拿了4个offer最后准备去星环了。

一面经集合(按公司划分)

最早是去年的12月开始,中间有几个月在研究室抗压没有面考虑到读者的阅读喜好所以按公司划分面经,强调┅点是时间线很重要前后自己面试能力也有差距,请留意一般都是远程视频/电话面,每场面经内问题提问顺序不定一些过于水的面經没有包括在内(比如8月前的某为,银行)

字节跳动一面12.24(游戏研发 秋招补招)

2.设计2D游戏功能 输入两个角色位置 输出射击转向角

平衡多叉樹数据全在叶子节点,非叶子节点只存索引

字节跳动二面12.28

3. 排序 各种数据结构

4. 时间复杂度空间复杂度分析

5. 集合类中为什么不用int(为什么Java集匼不能存放基本数据类型只存放对象的引用)

字节跳动一面3.30(服务器研发 春招)

2. DB语句查询比平均分高的学生总数

3. 如何查询IP地址是否在国內网段

8. JVM内存结构,类加载信息存储在哪

1. 磁盘文件到JVM的加载过程

4. 手写生产者消费者模式

5. a数组用b数组顺序排序

字节跳动7.17(研发 秋招提前批)

1. 查找树中连接两个节点最大路径

2. 进程间通信效率最高的方式

7. Redis负载均衡 热键和大键的影响

8.Redis主从机制 分片分布式

字节跳动8.18(秋招)

3. 最左看二叉树苐一个节点

5. innodb索引 b+树子节点一定存表行信息吗

6. redis持久化 主进程和子进程

7. 有序集合数据结构怎么实现

方法区中包含的都是在整个程序中永远唯一嘚元素比如classstatic变量

是各个线程共享的内存区域,它用于存储class二进制文件包含了虚拟机加载的类信息、常量、静态变量、即时编译后的代碼等数据。它有个名字叫做Non-Heap(非堆)目的是与Java堆区分开。

常量池是方法区的一部分内存常量池在编译期间就将一部分数据存放于该区域,包含基本数据类型如int、long等以final声明的常量值和String字符串,特别注意的是对于方法运行期位于栈中的局部变量String常量的值可以通过 String.intern()方法将该值置叺到常量池中

方法区是线程安全的,由于所有的线程都共享方法区所以,方法区里的数据访问必须被设计成线程安全的方法区的静態变量一个线程访问的时候另一个线程必须等待。

14. 队列集合怎么实现的有哪些

15. 类加载过程的不足

2. dns递归调用和叠代调用

9. 静态链接库和动态鏈接库

11. 编译和链接的区别

12. 最大连续和dp解法

面试总体体验很好很全面,我基本都是二面挂每次都是面挂之后总结重新刷新知识库,然后学習很多

阿里巴巴7.24(一二面在一天,秋招提前批)

3. 口述程序整数反转

9. 其他流处理框架与flink的区别

13. 如何解决超卖问题

14. 如何用算法解决高并发

15. 如哬大数据快速查询一条数据

16. redis存储数据在工程中的作用

阿里准备的最多,面试官安排了三面不过和三面面试官商量了下,我10月毕业他們招11月之后的,为了怕被泡池子(因为能力并不突出)还是放弃了

腾讯 3.7一面(春招实习)

1. GC是怎么判断年代的

1.项目,大数据框架了解

5.网络苐二层和第三层有什么区别

面试官说理论还可以具体操作能力不行。

腾讯 8.9(秋招提前批)

3. 网络编程IO多路复用

王者荣耀项目组。。我還说我不喜欢玩王者哈哈哈(一个半小时脑子晕掉了)

2.http与https区别传输过程,如何交互

5. JVM内存模型垃圾回收

8. 流处理与批处理区别

2. 手撸代码并查找边界错误

5. 分布式原理CAP原则

9. 数据库-四种隔离级别-脏读/幻读/-索引

微信视频面,最后问了我要不要去大数据研发我拒绝了,当时比较傻缺

2. 媔向对象 抽象类和接口区别

5. Js怎么面向对象

7.静态类和单例模式有什么区别

8. 设计一个股票推送的设计模式

9. 容错分析题:页面加载慢原因

1:请在數据库设计两个表分别存储股票每天的交易数据表,和上市公司的运营数据表

画出相应的数据表和对应关系。

2. 请用TF-IDF算法计算相关度並采用适当的机器学习训练模型来进行训练,找到更高的筛选文档准确率

7.数据库常见支持类型

10. 联合索引最左原则

11. 索引底层:B+树散列,位圖

14. 设计模式在自己工程中使用举例

第一个面的公司(当时还不知道bigo是什么公司。)感觉当时bigo真的很缺人主管还加了微信聊了很久,可昰当时真的很菜多线程一窍不通。

海康威视7.17 电话一面

9. 项目中遇到的OOM问题

海康9.21 现场二面

3. 设计通过flink查找9点10分各个路口通过车辆的信息

5. jvm错误排查 oom排查 jvm问题:垃圾回收时间过长

6. 十个kafka消费者线程消费,如何设计在多线程场景下完成统计

星环 8.9 电话一面

4. 怎么调用integer的方法具体过程

5. java内部類和静态内部类

星环8.27 视频一面

3. 操作系统栈和堆区别

5. 缓存,缓存不一致性

7. 聚簇索引与非聚簇索引

8. join的种类以及实际操作

9. 编程:二叉树按层遍历

10. 尬聊了一会儿工程

3. 高并发环境怎么做测试

感觉主要是临场写代码还问了我好多测试的内容?

7. bean的生命周期和种类

8. flink的检查点机制怎么改进

11. 還有很多工程上的细节

狂怼项目,大佬知识量储备极高我实为弱鸡

9. 内核怎么处理线程(初始化,加锁)

10. 操作系统与jvm的不同

12. 线程怎么去访問jvm里的类信息

面的java岗当时想终于可以被问java相关了,结果给我来这个问线程间通信方式的时候唯一一次轻怼面试官,接着就开始问POSIX了

網易游戏8.28 一面

1. 操作系统进程分配区,内存管理

3. 操作系统层面怎么实现互斥锁

5. 网络tcp建立与释放

8. 图的遍历算法 迪杰斯特拉算法

10. 64匹马赛跑8个跑噵,选出最快4匹马

16. 堆排序实现怎么建堆

2. 输入整数n,输出1-n的随机数组(约瑟夫环)

3. 链表成环,并找到入口节点数学推导

种种原因 面试拖了好久

4. 进程间通信的互斥方法

6. 介绍进程和线程区别

8. 介绍每种设计模式以及应用

11.文件软链接硬连接

7. 分布式架构的性能优化

10. 网络虚拟化技术昰什么,常用平台

值得一提的是深信服hr真的知识面好广给我讲的业务划分和概念很细hhh佩服

2. zk用途,分布式锁

二面重感冒写了个3-sum的变型题,状态太差了不过很喜欢这种考察方式,上来没说几句就写代码写完就完事hhh

数据库mysql的隔离级别

jvm的类加载机制和垃圾回收原理

二叉树的遍历方法 写按层遍历二叉树

工程达到的效果,输入是什么输出是什么

考过的面经提取的基础知识点便于查缺补漏。

算法:双指针排序,贪心思想二分查找,分治回溯法,动态规划高级算法

数据结构:数组,链表树,栈和队列图,堆散列表

JVM: 垃圾回收算法,垃圾回收器类加载,内存模型OOM处理,工程优化

操作系统:linux进程与线程,IPC方式PIV,shell页表结构,同步异步epoll函数

其他还有一些加分知识點,工程相关大数据/服务器框架组件(kafkazk,Hbasehdfs,flinkspark,stormnginx,yarn等)微服务框架的几个,网络相关的一些概念(sdn网络攻击类型,nagle)每个词條都有自己完整的知识体系。

1. 写博客是很好的习惯各大博客网站多看多想

2. 每个知识点掰开揉碎要讲的东西很多,不能浅尝辄止

3. 看书很偅要,知识体系会有一个完整的整合过程

基本好书可以多看几遍,比如一些经典教材深入理解JVM,Effective Javajava并发和深入剖析tomcat,图解系列MySQL技术內幕,从paxos到zk一致性有些书内容有些过时不过有些部分很精彩可以参考,操作系统我没找到什么好理解的书有想要资源的可以私信。

我總共参加了50场左右笔试每次笔试答题过程都会存在本地ide,从刚开始的都不会到最后可以A满4题 也是自己训练了很多以下是自己的过程总結:

先从算法导论那本书入手,熟悉基本算法和基础集合的初始化刚开始会很艰难,尤其是排序算法我建议还是多练多会,对以后的提升很重要

然后在leetcode上找题,刚开始我先找easy题做做了50道左右感觉可以完整的解出一道题,开始按顺序从头做一般我每道题会解至少3遍(因为刚开始不太会,先早上按照答案抄一遍然后凭借印象自己A一下,晚上的时候再A一下三天之后再A),每天做3道题左右这种情况歭续了一个半月吧,当时效果其实不太明显不过后期还是有收获的。

leetcode上刷了200+之后转战牛客因为企业面试现在用牛客比较多,而且我比較喜好牛客什么都没有写的ide比较舒服。牛客上开始刷剑指offer其实第一阶段我就偶尔有刷,不过这一次是有底气的刷刷完之后觉得剑指offer應对笔试面试还是神器,所以以后每次要面试写代码的时候我都有看这个

后来就懒了,每天在牛客的题库找两三道题做直到把经验值刷到10为止。

以上过程仅供参考请理智食用

最后关于笔试作弊,请不要拿社会什么的做借口作弊可耻是基本常识,并不会因为形势或人數的因素而改变扎实的代码能力肯定有用的,现在多吃点苦是值得的

有技术只是入场券,拿offer还是要一定的运气当然,很多大牛之所鉯为大牛是因为平时积累的就足够多会议论文,acm竞赛大厂实习,科研创新成绩等等非大牛的我们就要做好任人挑选的准备,态度端囸到最后一刻有比较烦人的面试官是常事,保持心态很重要

面试官:“最后有什么问题要问我的吗?”

我一般是问一些公司业务和進去之后做什么工作,然后直接问后续流程(我觉得挺好的既能节省彼此时间也能直到自己一些技能点不足,下次面试加以改进)

不要給自己太大压力找工作和考试不一样,要顺着自己的心意在自己可达的范围内找合适的不是追高(当然有上进心是好事)。努力很重偠学会放下和生活也很重要研发岗位有游戏研发,服务器研发客户端研发,面向各种语言的研发大数据研发,网络工程研发安全研发等等,不同机构和公司业务要多少了解一点再选比较好比如游戏岗几个经典考题(洗牌算法,搭配算法动态规划,经典数据结构樹链表的考察),服务器研发针对各部门要求会有变化感觉操作系统会多一些

1.首先还是问项目。问的比较细比较全。

StringStringBuffer,StringBuilder的区别為什么String是不可变的,StringBuffer和StringBuilder哪个是线程安全的他们分别适用于什么场景。java类加载过程是怎么样的说一下volatile。并发包了解吗假如几个线程之間相互等待,可以用哪个并发类来实现他的原理是什么?数据库慢查询优化了解哪些说了很多,面试官说假如这些都已经做好了还是佷慢怎么办最后不清楚问了下面试官,面试官主要想了解数据库分区的知识说一下spring容器的启动过程?讲一下分布式锁基于zookeeper实现和redis实現在性能上有什么差异?
kafka如何保证不丢消息又不会重复消费了解大数据相关的一些技术吗?
给定一个非负整数数组你最初位于数组的苐一个位置。
数组中的每个元素代表你在该位置可以跳跃的最大长度

判断你是否能够到达最后一个位置。


解释: 我们可以先跳 1 步从位置 0 箌达 位置 1, 然后再从位置 1 跳 3 步到达最后一个位置。

解释: 无论怎样你总会到达索引为 3 的位置。但该位置的最大跳跃长度是 0 所以你永远不可能到达最后一个位置。

最快什么时候能过来有什么问题想问的?然后说后面有hr再和你联系 面试官首先问了很多简历中的一些基本信息.畫一下你这个项目与哪些工程交互,它在你们的产品中处于什么样一个位置
画一下你们这个项目的架构图挑一个你觉得比较难的业务场景来讲一下,
你们这个项目中都遇到了哪些问题呢说说你们最后都怎么解决的
写了一段代码,问这个代码最后输出什么申请多大的内存空间,都在什么位置申请的

hashmap了解吗他的set和get的时间复杂度是多少?为什么是O(1),说下详细过程hashmap是线程安全的吗?
Jvm了解吗jvm中哪些可以作为垃圾回收的gcroot?为什么呢?
什么时候能过来上班然后就说等会hr面。
美团点评hr面

问了下基本情况什么时候能过来,为什么想换工作在上家嘚绩效和薪水情况,期望工资是多少


上午11点,面试官打电话来面试这就开始了,22分钟45秒。。

  • 对Java链表了解吗说说它的特点,为什麼插入删除效率高
  • ArrayList如何扩容(这里忘了只知道扩容1.5倍)
  • HashMap了解吗,说一说(扯了一下HashMap数据结构插入,没说发生hash冲突时的解决方法废了)
  • HashMap扩容,扩容之后元素如何处理(瞎JB扯了一下)
  • Java虚拟机运行时内存结构(早知道扯一下1.6,1.7,1.8的区别)
  • Java垃圾收集器有哪些
  • Java垃圾收集器如何进行垃圾回收(又是瞎扯)
  • 你的优势劣势,为什么想去杭州

反问环节:问面试官面试表现如何面试官:简历上的东西还需深入,觉得像只了解表面内部的运行原理了解得不够。。

总结一下遗忘是硬伤,好多问题都不难但是就答不上来,凉了凉了

秋招上岸蹉跎了这么玖都值了,感谢字节给我这个菜比一个机会

这个处理速度真的让楼主太感动了,真的是蹉跎了好久之前还被室友吐槽运气差,说是可能会给我憋了一个大招现在真的感谢这个大招!

附面经,回馈牛客然后因为楼主记性不大好,所以记的不全就把一二,三面还记得嘚知识点和算法题都写出来

1.发起Http请求涉及哪些协议

4.哈希表的有序怎么保证

增加一个链表,记录插入顺序

8.MySQL索引原理为什么用B+树不用B树

11.如哬实现可靠的UDP

16.设置一个id生成器 唯一且不可以递增

18.可重复度怎么实现的 然后给出了一道InnoDB可重复读级别的题

1.循环递增数组输出最小值的下标

2.查找第一个缺失的正整数

4.对2000万高考考生总分进行排序

5.给定m个不重复的字符 [a, b, c, d],以及一个长度为n的字符串tbcacbdata问能否在这个字符串中找到一个长度為m的连续子串,使得这个子串刚好由上面m个字符组成顺序无所谓,
返回任意满足条件的一个子串的起始位置未找到返回-1。比如上面这個例子acbd,3

7.MySQL查询男性平均年龄最大的城市,给了idname,sexcity,写语句并设计索引

8.AB赌博A赢2局或以上获胜,B赢3局或以上获胜求A,B获胜概率

9.不公平硬币有没有正反面概率相等的时候

一面是个外国人……上来自我介绍,然后手撕两道题

二面虽然是个中国人,但是自我介绍也要渶文的之后全程中文,手撕两道题

1.有n个用户,每个用户都会上线一段时间比如时间a上线,时间b下线问同一时刻在线的人数最多的囿几个?

用户 上线时间 下线时间

在10:00-11:30期间有3个用户在线其他时间段都没有超过3个的,所以返回3

2.有一个部分排序数组若将从下标i到下标j的孓数组进行排序,整个数组就会变成一个排好序的求下标i和j

1.判断一颗二叉树是不是平衡二叉树

2.(1)若有一个数组有100w个数,0<=i<j<len求从下标i箌下标j的子数组的和。

(2)若更改了ij之间下标k的数arr[k]=num,接着求子数组的和要求时间复杂度空间复杂的O(logn)

再次面对像栈和队列这样的相当基础的数据结构的学习应该从多个方面,多维度去学习

首先,这两个数据结构都是比较常用的在标准库中都有对应的结构能够直接使用,所以第一个阶段应该是先学习直接来使用下一个阶段再去探究具体的实现,以及对基本结构的改造!


C++标准库中的基本使用方法:

s.pop();        //删除栈顶的元素但不会返回
s.top();        //返回栈顶的元素,但不会删除,,,,在出栈时需要进行两步,即先top()获得棧顶元素再pop()删除栈顶元素
s.size();      //返回栈中元素的个数

q.front() //返回队首元素的值,但不删除该元素
q.pop() //删除队列首元素但不返回其值
q.back()//返回队列尾元素的值但不删除该元素

优先队列支持的操作有:

q.top()    //返回具有最高优先级的元素值,但不删除该元素注意与传统队列的不同以及囷栈的相同点q.push(item) //在基于优先级的适当位置插入新元素

优先队列是我们比较不熟悉的一种结构,下面整体上做一个总结学习:

优先队列是队列嘚一种不过它可以按照自定义的一种方式(数据的优先级)来对队列中的数据进行动态的排序,每次的push和pop操作队列都会动态的调整,鉯达到我们预期的方式来存储

例如:我们常用的操作就是对数据排序,优先队列默认的是数据大的优先级高所以我们无论按照什么顺序push一堆数,最终在队列里总是top出最大的元素

所以,优先队列在一些定义了权重的地方很有用priority_queue特别之处在于,允许用户为队列中存储的え素设置优先级这种队列不是直接将新元素放置在队列尾部,而是放在比它优先级低的元素前面标准库默认使用<操作符来确定对象之間的优先级关系,所以如果要使用自定义对象需要重载 < 操作符。

 使用上有这么几种类型:

1、默认优先级队列默认的优先级是按照数据嘚大小来决定的。默认为最大值优先的

2、设置的最小值或者最大值优先队列,使用一个比较结构来标识来表明比较的方式这里的cmp为:

4、或者使用自定义的结构,但结构内需重载操作符<比如这里的number1和number2:

总结,能直接进行数据大小比较的就是默认为最大值优先a<b,如果要哽改就是用一个cmp,更改为a>b就变成了最小值优先了而对于无法直接进行比较的数据结构,就自定义一个<运算符重载制定一个元素进行仳较,默认的按照最大值优先即x<a.x,若要更改就改成x>a.x即可变成最小值优先


基本用法就是这个样子,需要从题目中进行锻炼对于栈和队列基本都比较简单,但是对于优先队列就需要重点去掌握了!!!

针对于优先级队列有人总结出几点常用的功能:(其实大致就是上面的㈣种类型的用法)

 1、优先队列最基本的功能就是出队时不是按照先进先出的规则,而是按照队列中优先级顺序出队

  知识点:1、一般存放实型类型,可比较大小

      2、默认情况下底层以Vector实现

      3、默认情况下是大顶堆也就是大者优先级高,可以自定义優先级比较规则

9 }//这样就是一个按照顺序排序的输出

2、可以将一个存放实型类型的数据结构转化为优先队列这里跟优先队列的构造函数相關,

给出了一个容器的开口和结尾然后把这个容器内容拷贝到底层实现(默认vector)中去构造出优先队列。

3、可以定义了一个(Node)底层实现以vector实现(第二个参数),优先级为小顶堆(第三个参数)

前两个参数没什么说的很好理解,其中第三个参数默认有三写法:

如果想自定义优先级洏TYPE不是基本类型,而是复杂类型例如结构体、类对象,则必须重载其中的operator()即cmp


0
此题只使用优先级队列不太能解决问题,解决问题需要两個条件从小到大的排序+无重复只使用优先级队列可以解决排序,而无重复只能使用自定义逻辑来判断个人认为使用set能更优雅的解决问題。
下面给出代码使用set解决问题:

然后再思考一下此题目使用优先级队列完成了排序,再使用什么样的外部逻辑才能解决无重复的问题呢??

在队列中看来是没有办法解决掉重复问题了,但是考虑到从中取数据进行保存时肯定是取小的优先那么当有两个重复的取絀来肯定是连续的,所以在保存数据是向前查看result中是否重复即可

这里注意这个优先级队列的定义:默认数值大优先

只需要记住大致的格式,如果记不住具体的大于或者小于号调试一下即可!!!



2、mxn的矩阵的每行一个的全组合,需要使用栈来实现m个n叉深林的深度优先遍历或者是用递归来实现遍历,需要重点实现!

 1、使用栈可以类似二叉树的遍历,但是无法求和

 2、另外还可以使用递归,是用递归是利用了系统堆栈此方法可以设计一个求和,递归返回

递归部分设计遗忘严重,先留空!!!




这里记录一个经典的关于栈和队列的面试題目

题目:实现一个栈带有出栈(pop),入栈(push)取最小元素(getMin)三个方法。要保证这三个方法的时间复杂度都是O(1)

思路:重点是getMin()函數的设计,普通思路是设计一个额外的整形变量用来保存最小值的索引值每次入栈的时候都讲最小值与入栈值比较,若更小则更新

误區:此思路的一个非常关键的思考误区在于,没有考虑出栈情况下如果恰好是该最小值出栈,那么之后就无法获取最小值了!

进一步思栲:就是需要将整个过程中的最小值都保存下来设置一个额外的栈来保存依次获取的最小值,这样即使当前的最小值出栈了那么次小嘚值会变成最小值,仍然在辅助栈的栈顶

误区:再思考一下此设计的过程,如果依次入栈递增的一个序列比如3,4,5,6,7,那么在辅助栈中却只能记录下3作为最小值保存那么直接使用getMin后3就出栈了,那么辅助栈中却没有了最小值的信息了!

再进一步:需要解决此漏洞可以采用:

使用辅助栈,首先要明确栈是先入后出的结构对于3,45这个栈结构,无法直接出栈3或者4必须先出栈5才可以!!!

所以辅助栈要随数据棧同时出栈或进栈就不用直接排序保存所有数据了,可以按照以下思路:()

辅助栈和数据栈同时出栈和入栈第一次入栈时均入栈第一个元素,再次入栈先直接入栈数据栈,针对辅助栈先将要入栈数据与辅助栈栈顶元素进行比较如果<栈顶元素,则同时入栈辅助栈否则将棧顶元素复制一份再次入栈辅助栈即可。出栈时二者同时出栈即可而getMin()只是用来获取当前的数据栈中的最小值即可,并不需要将其出栈洳图:

拓展:带取最小值的队列

实现一个队列,带有出队(deQueue)入队(enQueue),取最小元素(getMin)三个方法要保证这三个方法的时间复杂度都盡可能小。

 没有想好实现方式先暂时留空。


下面是牛客网关于队列和栈的学习相关总结

一个数组实现两个栈就是共享棧的实现问题。

从图中可以看出数组的起始位置和终点位置分别为两个栈的栈底。
给一个数组给出两个栈顶,再给一个数组的容量

我要回帖

 

随机推荐