2019上海爱奇艺大数据Java实习生-面试记录

时间:2023-03-08 21:21:16
2019上海爱奇艺大数据Java实习生-面试记录

目录

补充:面试未通过

一轮 电话面试

2019.04.28 16:21

[w]:面试官,[m]:我,下面的内容来自电话录音。

[m]:喂,喂
[w]:喂你好,请问是xxx同学吗?
[m]:对,是的;
[w]:你好,我这边是上海爱奇艺,之前和你约好下午有电话面试,你现在那边OK吗?
[m]:可以啊
[w]:你那边信号好吗?听我说话听的清楚吗?
[m]:听得清楚呀,你那边听得清楚我说的吗?
[w]:嗯,我这边听得清楚
[w]:行,那我们就开始;
[w]:我先问一下,你现在人在哪个城市啊?
[m]:在苏州呀
[w]:苏州,就是中科大苏州这边软院是吧;
[m]:对
[w]:嗯好的,你平时开发的主语言是Java吗?
[m]:对啊,是Java;
[w]:好的,那我主要是问一下Java相关的一些基础知识
[m]:哦,行
[w]:Java有个最基本的类Object,这个类默认包含哪几个方法?
[m]:wait,notify,notifyAll,finalize,toString,hashCode,equals;
[w]:还能想到其他的吗?
[m]:没有了啊,想不到了;
记:还有:clone、getClass;
[w]:好,那我再换一个东西问,Java里面,你日常写代码中遇到过哪些Exception,能举一些例子出来吗?
[m]:空指针、角标越界,Emmm...能想到的是这两个
[w]:还能想到其他的吗?
[m]:其他的,在写测试的时候会用到那个什么...Interr...就是打断的异常,Intercept异常。(其实是InterruptedException)
记:面试官主要是想看你遇到哪些异常,然后来推断你的实践范围和能力。
[w]:好,我问一下Java里面有那个==,它和Java的equals方法有什么区别?
[m]:等号(==)就是看一下那两个对象(引用)是否指向同一个内存空间,就真的是相等;equals的话,那个Object里面equals()默认的话就是用==,所以你可以覆写的话,就可以自己去定义一下是否相等;
[w]:能说一下有没有什么很经典的场景,或者很经典的类是覆写了这个方法吗?
[m]:String类;
这块答得还阔以;
[w]:好,问一下Java创建线程有哪几种方法?
[m]:可以写一个类去继承Thread那个类,然后....(我还没说完)
[w]:嗯,还有其他的吗?
[m]:还有直接写个Runnable类(子类),传到Thread的构造函数里面;
[w]:还有其他的吗?
[m]:还有一个是Callable,就是实现这个接口,用Callable....(还是没说完)
[w]:那个Callable和Runnable有什么区别?
[m]:Callable它有个返回值,返回一个Future,然后...(再次没说完)
[w]:问一下,如果我们创建了这个线程,我想执行这个线程中的具体逻辑,我可以调用这个线程的start()方法去执行它,也可以调用这个线程的.run()方法去执行它,这两种执行方式有什么区别吗?
[m]:.run()的话就是不开启线程,就是直接调用个方法,.start()方法就是开启个线程吧;
[w]:好,问一下Java线程中的sleep方法和wait方法有什么区别?
[m]:sleep的话就是睡了,它不会释放锁,wait的话就是先要获得那个锁,才能释放;
[w]:处于wait状态的线程要用什么命令去唤醒它?
[m]:用notify,notifyAll;
[w]:notify和notifyAll有什么区别?
[m]:notify就是唤醒其中一个吧,notifyAll的话就是唤醒等待这个锁的所有线程;
[w]:如果现在有很多个线程在等待中,你不调用notifyAll(),而是调用notify(),会唤醒哪一个?
[m]:是唤醒随机一个吧(其实我也不太确定);
这块答得马马虎虎,有一些问题不太确定;
[w]:我再问一下,Java里面的多态相关的概念,多态里面有两个经典概念,一个叫重载,一个叫重写,能说一下这两个有什么区别吗?
[m]:重载的话,你可以不用涉及到什么父类之类的,定义一个方法的唯一标识就是方法名称、参数类型、参数个数,方法名称相同,参数类型,参数个数,这两个不同的话,那就是重载;
[w]:嗯,重写呢?
[m]:重写的话,就是要和父类相关,方法名称要相同,参数类型、参数个数要相同,可以把父类的方法覆写,实现自己的方法;
[w]:我问一个场景:你在子类中写了一个方法,它和父类的那个方法,方法名字是一模一样的,参数的类型和参数的个数列表也都一模一样,唯独返回类型不同,这样你调用这个子类方法,会返回哪一个?
[m]:返回类型不同的是吧,就调用子类的呀;哦,不对,这个它也实现了嘛,重写,因为标识就是方法名称、参数个数、参数类型都相同的话,调的应该就是子类的;(其实我感觉这里是有问题的,但是不太确定)
[w]:我问一下,如果是在同一个类里,你写了两个方法,方法名一模一样,参数列表一模一样,唯独返回类型不同,调用的时候会执行哪一个?
[m]:这可以吗?
[w]:这个不可以在哪里?
[m]:这个东西就是....它,如果你定义返回类型,哦...返回类型....(有点不自信)不好意思,刚才突然打断了,就是两个方法同名是吗...(面试官get到我的疑惑了)
[w]:对,就是在同一个类里,你写了两个方法,方法名一模一样,参数列表一模一样,唯独返回类型不同;
[m]:返回类型不同,然后咧?然后调用哪个???然后就没有了吗?但我觉得这个就,我没见过这样写的,而且感觉定义会有问题啊,返回类型不同定义会有错误,编译会有问题;
[w]:如果这种编译会错误,那么前面那种编译为什么不会错误?
[m]:对喔,前面那个也会有问题哦...
[w]:行,这块你回去再理解一下,或者你再查查资料,但是还可以;
这块答得不行,就是对知识点理解的不充分,所以才不自信;
[w]:我接着问一下Java 的垃圾回收你有多少了解?
[m]:GC是吧,就是....额....也不是很深,但稍微了解过,看过那本《深入理解JVM虚拟机》
[w]:我这么问吧,Java如果我们想要了解它虚拟机的话,常常会在JVM虚拟机中设置一些参数,比如说:Xmx,Xms,这些参数有见过吗?了解它什么含义吗?
[m]:就是指定那个堆空间大小吧,-Xms、-Xmx,就是指定堆空间的大小,会有限制,最大或最小;
记:
  • 其实GC这部分我还是了解过一些的,比如GC分代、回收算法、标记算法,但是我确实不敢说我了解的有多深;
  • 对于Xms和Xmx的回答,我可能答错了,所以面试官直接跳到下一个模块来问;
[w]:嗯,行,我问一下那个Linux你了解吗,我看到你简历有写:你有Linux基本的使用技能;我问一些Linux的基础命令;
[m]:呵....你问吧
[w]:在Linux命令中,重命名一个文件用什么命令?
[m]:move,mv
[w]:如果在Linux里面,想要找到这台机器上的所有tomcat进程,要用什么命令?
[m]:tomcat进程是吧,ps -aux | grep tomcat
这块还可以吧;
[w]:嗯,好,问一下一些基础的....你们有没有学数据结构和算法相关的东西?
[m]:学了一些;
[w]:嗯,那个排序算法里面有一个比较经典的概念,就是叫做“稳定性”吧,我们经常说有些排序算法是稳定的,有些是非稳定的,这个稳定指的是什么意思,知道吗?
[m]:知道呀,比如说有原始数据,1,1,就是两个1嘛,一个是在角标1,一个是在角标2,排序过程中,如果是稳定性算法的话,这两个数字的相对位置是不会发现变化的,不稳定的话....(还没说完)
[w]:这样,我接着这个问,哪些是稳定的排序算法?
[m]:稳定的算法,冒泡吧,插入排序,Emmm....想一想,现在想到的是这两个;
[w]:嗯,行,就这个里面我再抽一个追问一下,刚刚你提到了冒泡排序,你现在能回忆一下冒泡排序的过程,我问这么一个问题,如果需要我们把冒泡排序改造成非稳定的,要怎么改?
[m]:改造成非稳定的,就是它会跟前面一个元素比较嘛,如果相等的话就把那个位置给换一下;
这块还阔以吧;
[w]:嗯,好的,OK,你们这边的情况我基本了解,我再问一下其他的一些情况,就是你期末考试是到什么时候啊?如果你能够过来实习的话,你是什么时候才能开始实习?
[m]:7月10多号结束吧,我们这边校历上是这样写的;
[w]:7月多少号?
[m]:这个我具体时间我记不清楚了,应该就是7月10几号,我现在就可以看一下;
[w]:7月10几号....
[m]:对,实习的话就是我结束之后,考完试后我就可以去;
[w]:嗯,大概可以实习多久呢?
[m]:大概的话,就是....(还没说完)
[w]:可以实习到明年这个时候吗?
[m]:可以呀,但是我想先问一下,就是那边实习的话,工作内容是否可以写论文,就是我们这边实习需要写论文;
[w]:额,放心,这边都是这个样子的,我把我这边的情况先给你介绍一下好吧;
[w]:我们这边其实大量是你们中科大的学长在这边实习,一般就是在自己的工作岗位上,用开发的内容就顺便把论文一起写了,一代一代都是这样子(说到这里,我噗笑了一下)。就是苏州中科大软院我们这边非常熟,你们的每一代学长都在我们这边有大量的同学,所以你看到的贴子应该是由内网,或者由内部院里发出来的对吧;
[m]:我看到的贴子是我同学在群里转发的;
[w]:哦(面试官笑了下),好吧,反正就是说是一代代学长们....你们的学长们都是在这边写毕业论文的,毕设的这个问题不是问题。所有同学到来年3月份,你开题的时候,我们都会给你题目,基本上就是跟你工作相关的内容,然后就是可以....比较放心吧。毕设的这个事情不用太担心。
[m]:嗯;
[w]:嗯,行,我觉得基本上,电话这轮应该是过了。之后的话,HR还会和你约一个面试,我想一下,你在苏州,其实是这样子,还是有一轮代码的面试,代码面试就比电话里复杂一点,会出一两个代码题让你写。尽可能是...因为,其实从你从苏州中科大来公司其实也很近,OK的话就约一个现场面试吧,到时候我通知HR。我具体说一下,其实你从苏州学校到爱奇艺这边来大概两个小时左右,因为那苏州高铁站不是坐20块钱的动车坐到上海虹桥火车站,爱奇艺就在上海虹桥火车站旁边,那这样的话你觉得OK的话,我就找HR约一下现场的面试,看你哪天有空你就来一下我们这边。
[m]:也行;
[w]:嗯,可以吧,那就,那就,具体时间,到时候可能在51之后的那一周吧,看你哪一天有空都行,随便抽一个下午过来,到了这边现场的话应该需要2~3个小时,就是方便的话,最好在下午的2点钟,或3点钟来,你晚上还能做个高铁回去。这样OK吗?
[m]:噢...噢...可以可以
[w]:行,好的,那我就跟你约一个下周的现场面试,到时候你可以做点准备。但是其实就和网上差不多,无非就是纸上写代码,这样子的,看一下你实际的代码本领;好的,OK,那这样,电话面试就到这边了。嗯,额....你对我们这边有什么问题想问的吗?
[m]:我想问...(话还没说完)
[w]:或者你可以到现场来,我们在现场聊也一样的(面试官也笑了),到这边,到爱奇艺公司来看一看,然后上海爱奇艺里你们很近。你们往年有很多学长都在我们这边。好的,那就这样,那今天电话就到这边;
[m]:嗯,好好...谢谢
[w]:嗯,好,OK,拜拜
[m]:拜拜

二轮 代码笔试

2019.05.07 14:00
写代码这一轮,是我到上海爱奇艺创新大厦现场进行的。面试官拿几张白纸过来,然后现场给你想个题目,在纸上画一画,把题目给你说明白,下面就是你自己开始手写代码了。时间应该是1h,如果你在1h内解题数<=1,可能就不及格了。如果你能力很强,那当然是做出的题越多越好,面试官也是按难度:低->高的模式给你出题的。
解答我就不贴出来了,网上一查挺多的。(解题不是只写个思路就OK,一般是要写个函数,或者难一点的话要写个类,要求你的代码是可执行的,导包那些可能不用写)
题目一 String转double
给你一个String,内容类似:“3.14159”、“-1294.28842”,不用进行特殊的判断,比如:小数点存不存在,整数部分存不存在等,让你把这个String转换为double类型。(不能调用现有的转换函数哦!)
我当时写的解题思路是:整数部分乘10累加,小数部分除以10累加;
题目二 二叉树蛇形打印
2019上海爱奇艺大数据Java实习生-面试记录

输出:a b c g f e d 1 2 3 4 5 6 7 8

我当时写的解题思路是:一层队列一层栈;

做完题目1、2,应该还剩20分钟左右,面试官有点犹豫,一开始说:那我们继续做个题吧,后面又说:那我们还是看一下简历吧。然后花了几分钟问了我些简历上的基本情况,后面可能他自己想“这部分内容也不是我负责的啊”,然后就给我出了第三个题目。

题目三 动态规划

数字1对应字母a,2对应字母b....26对应z,我们给你一个字母组成的字符串“abc”,你可以转为“123”。现在是要给你一个数字组成的字符串“123”,让你求出有多少种可转成的字符串。比如:

  • 123:1-a、2-b、3-c,最后可转为:abc
  • 123:12-l(小写字母L)、3-c,最后可转为:lc
  • 123:1-a、23-w,最后可转为:aw
  • 所以总共有3种可转换成的字符串;

这个题我没写出来,一开始想分治,后来觉得不对,应该用动态规划。后来时间到了,他说没事,你回去看一下《算法导论》的动态规划。

2020.02.21 更新,最近刷 LeetCode 刷到了原题,传送门:https://leetcode.com/problems/decode-ways/,写了下题解:https://leetcode.com/problems/decode-ways/discuss/515060/Java-1ms-O(N)-96.79

回到目录

三轮 技术面试

2019.05.07 15:00

这轮面试我感觉自己完全被吊打,前面打小怪感觉良好,后面被Boss反杀。由于是现场面试,就没录音,只是根据印象记了些内容,现在整理出来。依旧是[w]:面试官,[m]:我。

[w]:刚才做了什么题目呢?
[m]:一个字符串转double的,还有一个二叉树蛇形打印的,还有个动态规划的,动态规划那个题没做出来。
[w]:嗯,你平常用的是Java是吧?
[m]:对
[w]:(面试官递给我简历)来,挑一个你熟悉的讲一下吧
[m]:(我挑了研一上学期的J2EE课设作业:SimpleController)
[w]:你这个项目是做什么的?
[m]:(我吧啦吧啦半天好像也没讲明白,一方面表达能力不行,另一方面我不清楚要基于什么样的粒度去讲解)
[w]:你从这个项目中学到了什么?
[m]:反射机制...(我本来想说反射和动态代理的,但我刚说完反射机制就被[w]打断了,后来想想,我觉得还是应该把话说完的)
[w]:那你怎么理解反射机制的呢?
[m]:一般调用对象方法都是用个对象,打点,然后调用的嘛,而反射机制缺可以通过类名、方法名等拿到一个方法调用的句柄,然后通过这个句柄来间接调用方法。(其实我这里写的还是我整理过的话语,现场我说的可能比这个乱一些)
[m]:(然后我很作死的补充道)有时候使用反射机制去调用对象的私有方法,可能会存在安全性问题。
[w]:你说反射调用一个对象的私有方法,会有安全性问题对吧,那你怎么解决这个问题呢?
[m]:(我一脸懵逼,后悔不该乱BB的,然后我开始基于事实的乱编),可以通过在对象中设置校验位来避免。
[w]:校验位???(面试官脑袋3个问号)
[m]:一个对象的状态是由它的属性来表示的嘛,如果通过反射机制来调用对象私有方法,可能会让对象转为不确定的状态(即:按理不应该出现的状态),那这时候在对象中设置一个校验位,在方法调用前都会检测这个校验位,如果校验失败则方法调用失败。也就是直接调用私有方法会让校验位变成“无法通过校验的值”。可以类比List集合迭代器的过程,如果在遍历的过程中删除元素,就会报错,这里面就是通过一个modCount校验位来实现的。(我当时的回答没这么清晰,大概思路就这样)
[w]:哦(我也不知道他听懂没,然后直接跳到下一个话题了)
[w]:常用的设计模式熟悉吗?
[m]:我知道一些,比如:单例、工厂...(我话还没说完)
[w]:单例,你怎么理解单例的?
[m]:有时候一个类并不需要创建多个对象,其创建一个对象就可以向外提供服务,如果创建多个对象,就会造成内存空间的浪费,所以使用了单例模式来控制对象的创建,保证一个类只有一个实例对象。
[w]:你能写出单例模式吗?
[m]:可以。(然后我写了第一个版本的:使用静态内部类来实现)
[w]:你这个编译有问题啊。(后来我看了下,确实有问题,但当时有点慌,就没注意到)
[w]:你为什么使用静态内部类来实现呢?
[m]:可以延迟加载
[w]:什么时候会被加载呢?
[m]:当调用那个静态方法的时候,会加载那个静态内部类,然后开始加载。
[w]:静态内部类你不会写,那你能写出其他实现方法吗?
[m]:可以。(然后我写了第二个版本:volatile+双重检测)
[w]:你能给我讲一下为什么要用双重检测吗?
[m]:(我讲了开头,然后中途不知道脑子怎么想的,突然觉得我写的是不是哪里有问题。其实我写的是对的,而且我也确实知道为什么那样写。只是当时要给面试官讲的时候,逻辑是: 如果这样子写,那就会有问题,但是我拿的是正确的代码来讲的,讲到途中突然发现没有出现预想的那个问题,所以突然脑子中断了一下,就一直没回过来。后来想想,自己好搞笑。)
[w]:代码写的出来,却不知道为什么?(他心里肯定在想,这小伙子肯定是为了应付面试,去背了代码。orz...我没有)
[m]:呵呵...
[w]:你觉得你的优势是什么?
[m]:我觉得我学习能力还是比较强的。
[w]:你能举个例子说明一下吗?
[m]:(这个问题我之前从没准备过,也是现场就编,但也是事实),我们上学期课程高级数据库有个大作业,要做一个完整的Web项目,旅游预订系统。我之前没怎么写过前端,然后各种查资料看前端内容,包括:bootstrap、Vue等,然后开始写代码,最后花了5天时间把这个大作业完成了。虽然这个网站做的不是那么完美,但我这5天看官方文档、菜鸟教程,基本都是full time写项目,算是挑战了自我吧,在这之前我没想过自己可以完成。
[w]:5天完成是吗?只做了前端吗?
[m]:不是,是全部,包括后端、数据库这些。
[w]:那你觉得你的缺点是什么?
[m]:我可能英语要差一些,相对于其他同学。然后表达可能会弱一些,就是脑子里面想得表达出来时不清晰。还有有点偏内向,不太善于社交。
(中间好像还问了什么,没印象了)
[w]:好吧,现在来看这么一个题:4x4的方格里,最左下角有一个点A,最右上角有一个点B,规定只有两种操作:往上移1步,或往右移1步,(注:不会往回走),问:从点A到点B有多少种走法?
2019上海爱奇艺大数据Java实习生-面试记录
(我想了想)
[w]:有思路吗?
[m]:将右移定位1,上移定为0,那就是取4个1和4个0的排列组合...(我话还没说完)
[w]:答案是多少?有多少种?
[m]:(我呵呵...)暂时没想出来。(后来吃饭时候和同学讨论,他说是2019上海爱奇艺大数据Java实习生-面试记录
[w]:如果让你用算法实现,你怎么做呢?
[m]:(我想都没想)做一个深度优先遍历吧。
[w]:你能用动态规划的方法来做吗?
[m]:(又是动态规划,之前没怎么刷过这方面的题,扑街)Emmmm,就是定义一个3维数组,g[u][v][?],然后起点(0,0)到其中一个点(0,k),然后再从k开始到终点,计算出这两个子部分的值,然后把它们相乘。
[w]:什么?3维数组?为什么是3维吗?我有点没清楚,你说的(u,v)是啥意思?
(然后我又讲了下,也没讲清楚)
[w]:你现在是有个比较清晰的解题思路呢,还是只是有个模糊的解答过程?
[m]:比较模糊吧,我是想定义(u,v),表示节点u到节点v的路径总数,但是这个节点又是个2维的。
[w]:那你要定义个4维的吗?(面试官好像笑了下)
[m]:Emmmm,应该不会那么麻烦的,应该有更简单的解题思路。
[w]:你动态规划方面的题是不是做的不多,我看你简历上有些刷题的,有leetcode啊。
[m]:对,我动态规划这部分练的比较少。
2020.02.22 更新,原题传送门:https://leetcode.com/problems/unique-paths/description/
[w]:好吧,那我们再来看下一个场景:N维向量,稀疏矩阵,这个稀疏矩阵中绝大多数是0值,只有很少一部分是非0值。假设有1亿维,如何设计一个类去表示这个稀疏矩阵,并且要提供其与另外一个稀疏矩阵相加的操作。
2019上海爱奇艺大数据Java实习生-面试记录
[m]:(这就是涉及大数据的知识了,我的盲区,我想了想,然后说)要压缩数据,建立一个小一点的数组,去记录稀疏矩阵中一个非0数后面有多少个0...
[w]:你写一写吧,可以写在白板上。
(我随便写了下内部的数据结构,然后他就过来看了。我大概跟他讲了一下思路,其实我挺迷的。一开始想到的是在源串上直接压缩数据,就是1个非0数字后面跟上一个0,0后面有个count值,表示这个非0数字后面0出现的次数,如果非0数字后面直接就是非0值,表示其后面没有0。这种压缩方法虽然可以解压缩,但是一时间没想到怎么提供加法操作,所以就用了额外的数组来保存count,然后还对原串进行分片....)
[w]:好吧,我大概懂你的思路。(我自己也没懂,我不知道他怎么懂的