我的后台Java面经,4W字汇总+我的复习策略(阿里、腾讯、头条、京东、IBM等)

简介

  • 经过招聘季每个人都会有相当多的面试经历,对我来说把这些写出来一方面是为了学习,另外一方面也希望能够为之后求职的同学提供一定的借鉴意义
  • 我的笔试经历会把主要记得的题目列出来
  • 我的面试经历详细介绍了以下几点
    • 面试岗位
    • 面试体验:这个有主观成分,但也能从我个人的侧面去反映公司是如何对待招聘的,请记住“面试者也是面试官,反之亦然”
    • 面试问题:在面试过程中被面试官提问的问题

 

  • 拉勾offer工厂2017资料,是当时拉勾做的一系列沙龙活动,其中ppt提到的面试问题很有参考价值,故而放到其中
  • 我面试的岗位主要是后台开发和Java开发岗,有关Java的复习策略在我的一篇博客中有写
  • 了解单独公司的单独部门情况,我又拆分了一下各公司的情况,想单独了解公司的可以去看各个公司的我个人面试情况

 

京东金融面试

面试岗位为JAVA开发实习生,一共有两面,第一位是年长的工程师,第二位是年轻的工程师,侧重角度不一样。第一位主要了解你的整体情况和个人想法,以聊天为主。第二位问了很多细节的题目,以问答为主。下面列举一下我遇到的问题

  1. java设计模式有哪些,讲讲单例模式具体怎么写还有具体用在哪里?装饰者模式是什么意思?
     
  2. 现在有三个表
  • S表

  • C表

  • SC表

查找出“数学分数最高的人名”,写个sql语句代码,写的时候我使用了in,然后问到in和exist的区别,哪个效率更好?SQL优化了解哪些?

  • springmvc路由你是怎么写的
    答:xml配置或者注解,RequstMapping
  • springmvc如何接受ajax数据
    答:有两个注解,一个能接收json数据,另外一个能返回json数据,好像是ResponseBody和RequestBody
  • 前端多级级联的select怎么写,比如说选择了河北省,下一级就会出现城市名
    答:使用jQuery,change监听函数里写ajax,返回后使用append函数加入下一级标签中
  • java的堆和栈怎么理解的
  • String a = "a",“a”存到了java的哪个区
    答:静态区

a的值是多少?
答:是“a”,因为java都是值传递,不是引用传递

"a"会被销毁么?
答:不会,因为string的加法运算相当于新建了一个对象,所以不会销毁

  • mybatis #和$区别
  • linux如何查看进程占用cpu和内存情况
    答:top指令
  • linux如何部署war包?
     
  • java环境搭建都用什么指令?
     
  • dns服务器如果域名和ip不一致,访问了该域名会发生什么?
  • 如果路由器上路由表内没有你要访问的地址会发生什么?
  • sql优化知道什么
  • 数据库字符乱码可能是哪儿的问题
  • nosql数据库用过什么,为什么使用
  • redis用过么,怎么理解的
  • 栈都有哪些典型用途
    答:十进制转二进制、括号匹配、二叉树非递归遍历
  • java虚拟机都知道什么
  • 抽象类和接口有什么区别
  • 重载和重写的区别
  • 有没有看过框架源代码
  • sql分页查询怎么写
  • mybatis实现原理、springmvc实现原理
  • SQL语句exist和in的区别
     
  • 还有如果简历里放了博客的话,人家可能会问你分享一篇你觉得你写的不错的博客
  • 查找13条到23条的sql语句
    答:select * from name limit 13,10

 滴滴面试

面试岗位为后台开发实习生,一共有两个面试官,面试的部门为地图开发部,主要使用语言是C++和Python,后台使用的是flask框架,总体上问的比较笼统,问细节上的不是特别多,有一些问题也没答上来

  1. 数据库引擎InnoDB和MyISAM的区别
  2. 大数据方面你读过什么书么,想做这方面的你有什么优势
  3. 写个二叉树的广度遍历和深度遍历
  4. ORM的实现原理
  5. Map Reduce的具体细节步骤
     

今日头条面试

面试岗位为后台开发实习生,一共有四个面试官,面试的部门为懂车帝,主要是做后台服务的,前三个应该是技术面试,但是第三个面试特别快,前两个面的比较久,第四个是hr面试,聊了聊今日头条的情况,带我参观了下今日头条的工作区,整体环境还蛮不错的,据说提供一日三餐

第一面

  1. 介绍一下项目
  2. 讲讲区块链和最近读的论文
  3. 比如1234的下一个比他大的数是1243,再下一个是1324,如何给出下一个数找到比他大的数
  4. 二叉树上最大值和最小值节点路径距离是多少?
    3 2 4 1 0
    像上面的树就是0和4,距离为3,其实本质就是遍历一遍先找到最大值和最小值,然后从根路径上进行遍历,从两个值路径分开开始记录遍历层数,然后加起来就是距离
  5. 问问实习经历

第二面

  1. 介绍一下项目
  2. 讲讲区块链,对我们当前的设计产生了极大的疑问,我也没有解释清楚,然后被鄙视了下研究生毕业设计没准备、研究方向不明确
  3. 问我熟悉哪门语言,我说java和python,然后问我学习过c++木有,我说本科学习过,然后就出了个strcpy库函数的实现,说很简单,,,结果空指针处理什么的,也没弄清楚,最后也没写明白
  4. 有两个文件a和b,找出里面相同的url,最开始我写的是遍历,时间复杂度是n2,然后用排序复杂度是nlogn,想起了字典树,复杂度是nlogm,面试官说可以用hash,复杂度就到n了,整个过程也不是很顺利

第三面

  1. 讲讲区块链,又讲了下我看的论文
  2. 问问你觉得你的优点是什么,缺点是什么
  3. 你觉得你是属于更能坚持的类型还是说更喜欢接触不同的新技术类型
  4. 除了技术外还有什么爱好
  5. 问问实习经历

第四面hr小姐姐

  1. 问问你的学习方向,用什么语言
  2. 头条你都了解什么
  3. 工作时间了解么
    balabala,总之hr还是相对和蔼可亲的

面完一天后生无可恋,回来就睡,太难受了

Redhat面试

面试岗位为JAVA的wildfly中间件开发实习生,套路和之前的不一样,是先让做一个工程,使用maven做一个J2EE的hello world,然后做单元测试,改了好久,直到这周才接到面试通知,本来打算直接是外国人的外语面试,但是由于经理很忙,就先由小组的中国人来面试。主要语言就是用JAVA,然后也先讲清楚了要做什么,和其他的面试很不一样,也是怕我没想清楚,毕竟和其他的实习性质有所区别,是在做开源,而且不是做常见的web开发,而是底层中间件web服务器的实现,包括需要测试东西,其实感觉我的个人经历和要求其实并没有很搭配,面试官对web开发相关的也并不是很了解,更多的是希望我沉下心来读很多的源代码,会很枯燥。

  1. 了解java什么,lambda表达式本质是什么?
  2. maven中之前让你写的phase表示什么意思?
  3. 英语自我介绍一下,你想学的是什么,不想学什么(纯英语面试)?
  4. git rebase是做什么用的?
  5. 有关注过什么开源项目?
  6. 平时用什么操作系统
  7. 之前说的工程里的有关单元测试的问题你懂了么?不应该throw异常了还能正常通过单元测试。

这只是第一次面试,还有下一次的意大利视频面试,是和外国面试官交流,压力很大。

Redhat 二面

第二次面试真是姗姗来迟,其实就是过去和中国面试官和外国面试官一起聊天,问问我几个基本的问题,并没有技术问题,其实就是练习下英语口语,自己渣的可以,至于会不会被录取也不知道,听天由命吧。

 阿里巴巴面试

面试岗位为JAVA开发实习生,今天已经不是第一次面试了,之前有一次,但是当时没记录,只好记录这次的了

  1. 自我介绍
  2. 讲一个项目,我说的区块链,然后围绕着区块链说了一堆,比如说我没回答上来的,有没有做性能测试,还有orderer节点都有什么服务
  3. 最大堆概念
  4. 排序算法比较排序时间复杂度,如何查找最大的1000个数
  5. 有没有什么排序算法能够小于nlogn的

美团面试

这次面试一共有两面,第一面比较简单问了很多基础问题,基本都能答上来,第二面问了很多细节问题,有很多发现自己理解不深刻,出现了问题,记录几个

  1. 跨域的理解,只有浏览器才可能存在跨域,跨域其实是在请求了某个域名的服务之后同时又去发起了其他域名的请求,所以只有浏览器可能存在,因为他会请求回来静态资源后解析再次发送请求,而类似于postman就不会有这样的问题,因为他得到的是静态资源文本而不会再次做解析
  2. tomcat解析sevlet发生了什么?
  3. 对于抢单场景要怎样设置数据库,要分开然后利用nginx根据hash去存库,查找也是同理
  4. JSONP如何理解,为什么没有使用
  5. 还问了两道算法题,但是自己写的比较慢,而且也不敢保证正确,毕竟好久没练了,但是题目都不难
  6. 最小堆如何做插入和删除的
  7. HashMap如何映射到内存里
  8. 如何评价自己在云平台项目的表现
  9. 数据库线程池有哪几种
  10. 对称密钥和非对称密钥是用来解决什么问题的

 IBM电话

投递的邮件有作用了,那边在做区块链医疗,招收实习生

  1. 是否有golang的开发经验
  2. fabric了解哪些
  3. nodejs开发经验
  4. 医疗你们这边在做什么

 

京东金融面试

面试岗位

JAVA开发实习生

面试体验

一共有两面,电话面试,第一面考察区块链,第二面考察java基础,问了很久,态度很认真

面试问题

  1. 区块链交易流程?
  2. java中spring是如何理解的?
  3. 四道算法题:
  • 第一题:一个人一次可以上一个台阶或者两个台阶,问到第n个台阶有多少种方法?
  • 第二题:n*m的迷宫,只能向右或者向下走,从左上角到右下角有多少条路线
  • 第三题:100101这样的数组,1表示有人在椅子上,0表示没人在,找到一个没人在的地方且距离所有人的距离之和最大
  • 第四题:有一亿个数,找到第10大的数

4. hashmap结构
5. get和post区别

京东金融面试

面试岗位

JAVA开发实习生

面试体验

非常糟糕!因为之前面试过所以只面了一次,而且在此次面试中知道了京东原来打着提前批的旗号结果是实习不给校招offer,真是套路满满,而且按照时间到了通州的京东之后hr临时预约邀请码,过了半个小时才带我上去,上去面了之后,居然又是半个小时没有人理我了,面试场地已经没有人了而且到了下班时间,然后给hr打电话不接发微信不回,过了十分钟我离开京东大厦,拉黑了京东金融的hr,这次面试导致了我生平第一次拉黑别人

面试问题

  1. java有什么更多的学习和了解,分布式?多线程?
  2. 金融系统的容错级别很高,讲了很多,balabala

拼多多笔试

不用多说了,四道算法题

第一题

  • 题目描述

自动售货机里有 N 瓶复制可乐。复制可乐非常神奇,喝了它的人会复制出一个自己来!
现在有 Alice, Bob, Cathy, Dave 四个人在排队买复制可乐。买完的人会马上喝掉,然后他和他的副本会重新去队伍的最后面排队买可乐。
问最后一个买到复制可乐的人叫什么名字?

  • 输入描述:

输入仅有一行,包含一个正整数 N (1 <= N <= 1,000,000,000),表示可乐的数量。

  • 输出描述:

输出喝到最后一罐复制可乐的人的名字。

示例1

输入
8
输出
Bob

说明:

前8个喝到可乐的人依次为:Alice, Bob, Cathy, Dave, Alice, Alice, Bob, Bob.

  • 解题思路
  • 代码
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String[] names = {"Alice", "Bob", "Cathy", "Dave"};
        while (sc.hasNext()) {
            long N = sc.nextLong();
            long i = 0;
            long basic = 4;
            while (N > basic) {
                N -= basic;
                basic *= 2;
                i++;
            }
            int y = (int) Math.ceil(N / Math.pow(2, i));
            System.out.println(names[y - 1]);
        }
    }
}

第二题

  • 题目描述

四年一度的世界杯又来了!小多在公司内发起了一个票选最强球星的活动。共有 N 个候选球星,每位投票者需要在选票上为每位候选球星评定一个实例等级,等级由英文字母表示,'a' 级最高,'z' 级最低,共26级。
我们称候选球星 X 强于候选球星 Y,当「 X 的评级比 Y 高」的票数高于「 Y 的评级比 X 高」的票数。若一个候选球星强于任一其他候选球星时,则称该球星为“球王”。根据这个规则,至多只会有一个球王。需要注意的是也可能没有球王。现在给出所有 M 张选票,请你帮小多判断一下哪位候选球星是球王。

  • 输入描述:

第一行包含2个整数 N、M,分别表示候选球星数量以及选票数量。接下来有 M 行,每行是一个长度为 N 的字符串,每个字符串表示一张选票上的信息。每个字符串的第 k (0 <= k < N) 个字符,
表示这张选票对第 k 个候选球星的评级。

数据范围:

1 <= N <= 50
1 <= M <= 50
字符串只包含小写英文字母(a-z)。
  • 输出描述:

若有球王,则输出一行仅包含一个整数 X,表示编号为 X (0 <= X < N) 的候选球星是球王;若没有球王,则输出一行仅包含一个整数 -1 。

示例1

输入
4 3
acbd
bacd
bdca

输出
0

示例2

输入
4 1
acad

输出
-1
  • 解题思路
  • 代码
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        while (sc.hasNext()) {
            int N = sc.nextInt();
            int M = sc.nextInt();
            sc.nextLine();
            String[] notes = new String[M];
            for (int i = 0; i < M; i++) {
                if (sc.hasNext())
                    notes[i] = sc.nextLine();
            }

            int[][] matrix = new int[N][N];
            for (int i = 0; i < M; i++) {
                for (int j = 0; j < N; j++) {
                    char a = notes[i].charAt(j);
                    for (int k = j + 1; k < N; k++) {
                        char b = notes[i].charAt(k);
                        if (a < b) {
                            matrix[j][k] += 1;
                        } else if (b < a) {
                            matrix[k][j] += 1;
                        }
                    }
                }
            }
            boolean flag = true;
            for (int i = 0; i < N; i++) {
                flag = true;
                for (int j = 0; j < N; j++) {
                    if (i == j)
                        continue;
                    if (matrix[i][j] <= matrix[j][i]) {
                        flag = false;
                        break;
                    }
                }
                if(flag) {
                    System.out.println(i);
                    break;
                }
            }
            if(!flag)
                System.out.println(-1);
        }
    }
}

第三题

  • 题目描述

有N个货物(0<=N<=1024),每个货物的重量是W(100<=W<=300)。如果每辆车最多的载重为300,请问最少需要多少辆车才能运输所有货物。

  • 输入描述:

一行输入,包含N个正整数,表示每个货物的重量,空格分隔。

  • 输出描述:

一行输出,包含一个整数,表示需要的车辆数。

示例1

输入
130 140 150 160

输出
2
  • 解题思路
  • 代码

第四题

  • 题目描述

A 国的手机号码由且仅由 N 位十进制数字(0-9)组成。一个手机号码中有至少 K 位数字相同则被定义为靓号。A 国的手机号可以有前导零,比如 000123456 是一个合法的手机号。小多想花钱将自己的手机号码修改为一个靓号。修改号码中的一个数字需要花费的金额为新数字与旧数字之间的差值。

比如将 1 修改为 6 或 6 修改为 1 都需要花 5 块钱。给出小多现在的手机号码,问将其修改成一个靓号,最少需要多少钱?

  • 输入描述:

第一行包含2个整数 N、K,分别表示手机号码数字个数以及靓号至少有 K 个数字相同。第二行包含 N 个字符,每个字符都是一个数字('0'-'9'),数字之间没有任何其他空白符。表示小多的手机号码。

数据范围:

2 <= K <= N <= 10000

  • 输出描述:

第一行包含一个整数,表示修改成一个靓号,最少需要的金额。第二行包含 N 个数字字符,表示最少花费修改的新手机号。若有多个靓号花费都最少,则输出字典序最小的靓号。

示例1

输入
6 5
787585

输出
4
777577

说明:

花费为4的方案有两种:777577与777775,前者字典序更小。

  • 解题思路
  • 代码

阿里巴巴菜鸟网络面试

面试岗位

菜鸟网络的JAVA开发岗

面试体验

工作内容为Java后台的业务开发,还有一部分C++工作,聊了大概1个小时,发现自己还是有很多基本的问题没搞清楚,有很多收获

面试问题

  1. malloc的时候操作系统是如何分配内存的
  2. http://taobao.com整个的请求过程,互联网协议入门(一)
  3. 比特币的交易过程,多久确认:10分钟
  4. Fabric使用CA的目的
  5. TreeMap的结构
  6. Promise和异步的区别
  7. REST和其他的区别
  8. fabric0.6和1.0的区别

阿里巴巴阿里健康面试

面试岗位

阿里健康的JAVA开发岗

面试体验

又发现了很多技术盲点,整体感觉良好

面试问题

  1. Fabric在哪里做的共识,如何解决双花问题和节点伪造问题的,比如说A给B转账5元,给C同志1元劳务费,但是该节点作弊了怎么办?
  2. 拜占庭算法的理解?
  3. TCP协议拥塞是怎么解决的?
  4. JAVA虚拟机的理解?
  5. JAVA线程池的参数都有什么?
  6. 有序链表和二叉搜索树在查找和插入上时间复杂度的区别?了解过红黑树么,在插入上有什么优化?
  7. 介绍下你觉得你做的比较好的项目,解决了哪些技术难点?

腾讯面试

面试岗位

前端开发

面试体验

首先很奇怪不知道为什么会被分到前端开发去,因为我并没有投递这个岗位,可能是放到简历池被面试官挑选的,前端我并没有准备太多所以回答的并不好,这里提醒面试者把求职意向写好,面试官很认真,自己答得不好,凉了

面试问题

  1. 为什么你们选择vue
  2. window下都有什么对象
  3. XSS的理解和如何解决
  4. 前端工程化用了什么
  5. 部署环境下如何调试
  6. 浏览器如何用js判断脚本
  7. 遇到问题时怎么查资料去解决问题

中国银联笔试

题目都是和考公务员的题目很像,包括选择题、逻辑题等,反而技术题目很少

中国银联面试

面试岗位

应用开发(偏核心系统智能运营)

面试体验

面试的时候发现人家都是穿正装来的,尴尬,都没准备衣服,得亏换了个衬衫,要不然太尴尬,整体面试安排和互联网公司大不相同

面试问题

  • 第一面是群面,给了一道题,金融相关的,没人看过资料后做一分钟发言,然后集体讨论15分钟,最后由一个人总结3分钟,群面其实还是蛮有套路的,如果自身能力不足不要冲前,主要是关注问题本身,关注讨论时间,把这两个做好基本就能通过面试
  • 第二面是技术面,整体没问太多就问了问项目,然后问了问DevOps,问我是否接受调剂,有运维的工作可能会被调剂,我就坚持说更希望开发,也能接受调剂

猿辅导面试

面试岗位

后台开发

面试体验

整体体验很好,早上去面试还准备了零食,面试官给人的感觉很舒服,尤其是第二面的时候,感觉确实在了解你整个人的技术水平和项目经历,而不是很多面试官就着自己懂得问题去问,或者就问自己准备好的问题,被尊重的感觉油然而生

面试问题

  • 第一面问了几个问题,然后主要是做算法题
  1. servelet生命周期
  2. java多线程共享变量怎么处理
  3. 链表删除倒数第n个数
  4. 给一个无序int栈,要求只能用栈这种结构来给栈中的int降序排序:再加一个栈就行了,用来存结果,再用给的栈做临时存储就可以
  • 第二面问了项目的问题,然后做了一道算法题
  1. ringbuffer实现put和get,注意处理满和空的情况:满和空要加个isFull或isEmpty来处理,记得最后处理这两个值

网易互联网笔试

岗位投递的是杭州研究院,先要经过笔试的洗礼,笔试的内容分为选择题40分,简答题20分和编程题60分,选择题和简答题记不太住了,主要写写编程题吧

  1. 小易觉得高数课太无聊了,决定睡觉。不过他对课上的一些内容挺感兴趣,所以希望你在老师讲到有趣的部分的时候叫醒他一下。你知道了小易对一堂课每分钟知识点的感兴趣程度,并以分数量化,以及他在这堂课上每分钟是否会睡着,你可以叫醒他一次,这会使得他在接下来的k分钟内保持清醒。你需要选择一种方案最大化小易这堂课听到的知识点分值。

输入描述:

第一行 n, k (1 <= n, k <= 10^5),表示这堂课持续多少分钟,以及叫醒小易一次使他能够保持清醒的时间。
第二行 n 个数,a1, a2, ... , an(1 <= ai <= 10^4)表示小易对每分钟知识点的感兴趣评分。
第三行 n 个数,t1, t2, ... , tn表示每分钟小易是否清醒,1表示清醒。

输出描述:

小易这堂课听到的知识点的最大兴趣值

示例1

输入
6 3
1 3 5 2 5 4
1 1 0 1 0 0

输出
16
  1. 又到了丰收的季节,恰逢小易去牛牛的果园里游玩。牛牛常说他对整个果园的每个地方都了如指掌,小易不太相信,所以他想考考牛牛。在果园里有N堆苹果,每堆苹果的数量为ai,小易希望知道从左往右数第x个苹果是属于哪一堆的。牛牛觉得这个问题太简单,所以希望你来替他回答。

输入描述:

第一行一个数n(1 <= n <= 10^5)。
第二行n个数ai(1 <= ai <= 1000),表示从左往右数第i堆有多少苹果
第三行一个数m(1 <= m <= 10^5),表示有m次询问。
第四行m个数qi,表示小易希望知道第qi个苹果属于哪一堆。

输出描述:

m行,第i行输出第qi个苹果属于哪一堆。

示例1

输入
5
2 7 3 4 9
3
1 25 11

输出
1
5
3
  1. 这题和leetcode 47比较像,就是n个a和m个z字母序排列,找到第k个排列数

示例

输入
2 2 6

输出
zzaa

2个a和2个z排列,aazz,azaz,azza,zaaz,zaza,zzaa,第6个排列数就是zzaa

阿里健康第二次面试

面试岗位

阿里健康的JAVA开发岗

面试体验

这次打电话又面试了很久,问了很多经典的问题,但很多又记得很模糊了,尴尬,本来都准备过的,可以答得很流利的

面试问题

  1. 一个数组中有正数和负数,找出来和最大的子数组
  2. 16瓶水中有1瓶水有毒,小白鼠喝了有毒的水1个小时后会死,一个小白鼠可以喝多瓶水,一瓶水也可以被多个小白鼠喝,现在给1个小时时间,最少需要几只小白鼠能够判断出来14瓶水是无毒的?
  3. java虚拟机垃圾回收机制
  4. 事务隔离级别有什么?
  5. concurrentHashMap实现原理?原来使用的什么锁?CAS具体如何实现的?
  6. Fabric的共识机制
  7. kafka不是共识机制么?
  8. 一个文本有很多单词,找出来其中词频最大的k个单词?如果内存读一次装不下怎么办?
  9. HashMap扩容是怎么实现的?多线程同时put会存在什么问题?
  10. 单例怎么写,懒汉和饿汉哪个更适合多线程?
  11. 线程池的参数都有什么?
  12. 最近在看什么书?
  13. 比特币的共识机制?

百度面试

面试岗位

搜索部

面试体验

后来了解到是做离线的搜索构建,也就是倒排索引,主要写C++,去了现场我就经历了一次面试,就回了,感觉没戏,人家对我并不感兴趣,因为我主要准备的Java,不过面试官态度很和蔼一直在微笑

面试问题

  1. TCP拥塞如何做控制?
  2. 进程间通信的方式有哪些?
  3. 哪些排序是不稳定的?快选堆希
  4. C++中的vector是如何实现的?
  5. 阻塞IO,非阻塞IO,同步IO,异步IO的区别?
  6. 事务的特性?
  7. TCP怎么做连接的?三次握手
  8. wait_timeout怎么看?show global variables like 'wait_timeout',这个是mysql的配置数据库连接超时的参数,文章
  9. 反转字符串
  10. 合并两个有序链表
  11. 找出数组中最长的递增数组
  12. 进程,线程和协程的区别

Indeed的笔试

Indeed实在太诱人了,但是做了四道算法题之后发现太难了,果然这样的公司抢手,算法题难度也非常大,好好刷题了要

腾讯笔试

  • 今天做了腾讯的笔试,题目如下

1.判断正整数是否是对称数,如3,123,121,12321。不能把整数转为字符串来判断。//返回 1:对称,0:不对称

int reverse( int value){
    int res = 0;
    while (value){
        res = res * 10 + value % 10;
        value /= 10;
    }
    return res;
}

int ismirror( int value ) {
    if(value == reverse(value)){
        return 1;
    }else{
        return 0;
    }
}

2.有一个链表,反转链表中第m到第n个元素。1 <=m <=n <= 链表长度
例子 1->2->3->4->5->6->null, m=2, n=4,反转后1->4->3->2->5->6->null

struct LinkNode {
  int value;
  struct LinkNode * next;
};

LinkNode * reconstruct(LinkNode * head, int m, int n) {
    ListNode *res = new ListNode();
    res->next = head;
    ListNode *tmp = res;
    for(int i=0;i<m-1;i++){
        tmp = tmp->next;
    }
    ListNode *p = tmp->next;
    for(int i=0;i<n-m;i++){
        ListNode *t = p->next;
        p->next = t->next;
        t->next = tmp->next;
        tmp->next = t;
    }
    return res->next;
}

3.有一个二叉树,每个节点的值是一个整数。写一个函数,判断这颗树中是否存在从根到叶子节点的一个路径,这个路径上所有节点之和为某一个值。存在返回1,否则返回0。

struct TreeNode {
  int value;
  struct TreeNode * left, * right;
};

int haspath( struct TreeNode * root, int value ) {
    if (root == NULL) {
        return 0;
    }
    if (root->left == NULL && root->right == NULL && value - root->val == 0) {
        return 1;
    }
    return haspath(root->left, value - root->val) || haspath(root->right, value - root->val);
}

4.实现x^n次方,时间复杂度要O(logN)

double pow(double x, int n) 
{
    Double res = 1;
    if(n == 0)
       return res;
    int tmp = n;
    while(tmp != 0)
    {
        if((tmp & 0x1) != 0)
           res *= x;
        x *= x;
        tmp /= 2;
    }
    return res;
}

网易互联网面试

面试岗位

杭州研究院

面试体验

这次面试可以说是我面试体验目前为止倒数top的,首先最重要的是这次面试没通过,其次要去杭州只报销去的路费,相当于自己要花将近700元在回来的路上,最关键的是第二面的面试官整体上不愿意和我交流,甚至连我的项目和研究经历都没问,只让我自己讲讲,经常面试到我回答完问题就不说话,好像不知道面试我什么一样,上来问我家在哪儿将来打算去哪儿工作,总体来讲面试官给我的感觉是,最开始就没想让我通过的心态去面试的,个人觉得作为技术面试官,这样的表现是非常不合格的,也让我对网易互联网的印象大打折扣

面试问题

  • 第一面
  1. AOP的实现机制
  2. 实现四个单例模式
  3. 共识机制的了解
  4. 分布式数据库是否使用过
  5. 缓存可能会出现什么问题
  6. 使用了Spring的什么特性
  7. 数据库sharding如何做,其实就是垂直切分和水平切分。。。
  8. tcp的三次握手和四次挥手
  9. B+树和B树的区别
  10. 二叉树和红黑树的区别
  11. ThreadLocal作用,为什么要使用
  • 第二面
  1. 10个商品的秒杀系统设计
  2. 如何解决缓存穿透,缓存雪崩等问题
  3. 讲讲jvm
  4. 如果发生了频繁的fullGC要怎么查找问题

腾讯面试

面试岗位

WXG事业部后台开发

面试体验

面试官非常nice,之前的笔试也是他通知我做的,还加了我的好友,每次面试前都会提前通知我一下,人也很和气,面试的时候全部的问题都是针对我的个人项目,问的非常详细,每个都是,并没有问一些基础语法或者一些基本课程的理解,虽然在实现的细节点上并没有特别考察我,但是从整体的项目上考察了我的理解和是否真的做了那么多,感觉还是很受尊重的,因为其他面试能聊两个项目也就最多了

面试问题

全部是关于项目上的,就不列出来了

阿里健康第三次面试

面试岗位

Java开发工程师

面试体验

阿里的面试整体感觉都蛮好的,这次面试官也很不错

面试问题

  • 如果给你之前实习的mentor提意见的话,你会提出什么?
  • 在做项目中的技术难点有哪些?有什么收获?
  • 一个对象里面存了开始时间和结束时间,现在有M个对象,求出一个没有交集的对象的集合

阿里健康第四次面试

面试岗位

Java开发工程师

面试体验

这次是到阿里健康里面去面试,面试官应该是级别较高的人,总体体验还是很好的

面试问题

  • 聊实验室的方向和做的项目
  • 说一件你最得意的事儿,最失败的事儿和最出格的事儿
  • 说一件你一直在坚持的事情
  • 有几百亿个数字找出其中的中位数

腾讯笔试

//请在1小时内完成以下4道题目,完成后请在题板发送消息。
//答案直接写在此题板上,面试官可以实时看到。
//====

1.有一个二叉树,每个节点的值是一个整数。写一个函数,判断这颗树中是否存在从根到叶子节点的一个路径,这个路径上所有节点之和为某一个值。存在返回1,否则返回0。

struct TreeNode {
  int value;
  struct TreeNode * left, * right;
};

函数定义如下int haspath( struct TreeNode * root, int value )

int haspath( struct TreeNode * root, int value){
    if(root == NULL){
        return 0;
    }
    if(root->left == NULL && root->right == NULL && value-root->value==0){
        return 1;
    }
    return haspath(root->left,value - root->value) || hashpath(root->right,value - root->value);
}
  1. 对于给定二叉树BT,其定义如下:struct BT{ struct BT *left, *right; struct BT *next, *prev; int value; };
    为方便中序遍历,现要求实现一个函数,使*prev, *next分别指向其中序遍历的前一个节点及后一个节点。
    函数定义如下:void BuildInorderThreadedBT(BT *root)
void Inorder(BT *root, vector<BT*>& res){
    if(root){
        Inorder(root->left,res);
        res.push_back(root);
        Inorder(root->right,res);
    }
}

void BuildInorderThreadedBT(BT *root){
    vector<BT*> res;
    Inorder(root,res);
    int count = res.size();
    cout << count <<endl;
    if(count<=1)
        return;
    res[0]->next = res[1];
    for (int i = 1; i < count-1;i++)
    {
        res[i]->prev = res[i-1];
        res[i]->next = res[i+1];
    }
    res[count-1]->prev = res[count-2];
}

3.某一个大文件被拆成了N个小文件,每个小文件编号从0至N-1,相应大小分别记为S(i)。给定磁盘空间为C,试实现一个函数从N个文件中连续选出若干个文件拷贝到磁盘中,使得磁盘剩余空间最小。
函数定义如下:
int MaximumCopy(std::vector<size_t> s, size_t C, size_t &start_index, size_t &end_index);
函数返回值为剩余空间,如无解返回-1。
其中start_index, end_index为文件的编号。
如N=5,S = {1, 2, 3, 5, 4},C = 7
结果为p = 0, q = 2, return = 1

int MaximumCopy(std::vector<size_t> s, size_t C, size_t &start_index, size_t &end_index){
    int count = s.size();
    size_t min = C;
    size_t tmp_start_index = 0;
    size_t tmp_end_index = 0;
    size_t sum = s[0];
    while(tmp_start_index<count){
        if(C - sum < 0){
            sum -= s[tmp_start_index];
            tmp_start_index++;
            if(tmp_start_index > tmp_end_index)
                tmp_end_index = tmp_start_index;
        }
        else if(C - sum < min){
            min = C - sum;
            start_index = tmp_start_index;
            end_index = tmp_end_index;
            tmp_end_index++;
            sum += s[tmp_end_index];
        }
        else{
            tmp_end_index++;
            sum += s[tmp_end_index];
        }
    }
    return min==C?-1:min;
}

--
4.公司减员增效,希望得到最大的收益(在收益相同的情况下,取裁员人数最小的方案)。假设有n个员工,每个员工的收益为cost[i]( cost>0说明为收益为正,cost<0为收益为负)。员工关系有m条,m[i]={ x,y}表示x是y的上级,如果员工的所属的上级被拆掉,那么员工也要被拆掉。现假设员工只属于一个上级,求解裁员后公司的最终收益值result,裁员员工id列表fire_list?

struct Relation{
 int x;
 int y;
};
struct Tree{
    int up; //上级
    int *down; //下级
}
Tree* createTree(const Relation* m, int m_size){
    for(int i=0;i<m_size;i++){
        //构建森林,可以考虑并查集
    }
}
void preOrder(Tree **root, int& result, int* fire_list){
    for(int i=0;i<root.size();i++){
        if(root[i]){
            //计算所有链上的最大和且和大于0
            res = cal();
            sum = calSum();
            //保存结果
            fire_list.push_back(res);
            result += sum;
        }
    }
}
void caiyuan(const int* cost,int cost_size, const Relation* m, int m_size,int& result, int* fire_list, int& fire_size){
    //构建森林,每棵树是多叉树
    Tree **root = createTree(m, m_size);
    //分别对每棵树进行深度遍历,遍历每条链表上从头开始的最大和且和大于0,如果每条都小于0那么整个树就都放弃掉
    preOrder(root, result, fire_list); 
}

完美世界面试

面试岗位

Java开发工程师

面试体验

整个过程从上午10点开始一直到下午5点,上午介绍了完美世界的情况,下午面试,等了好久只面了一面,问的问题都非常细,感觉自己表现并不好

面试问题

  • 基本collection类中包含哪些
  • hashmap如何判断key值重复
  • 线程池的实现,offer和take
  • Spring到controller前的过程
  • sql语句实现

拼多多面试

面试岗位

Java开发工程师

面试体验

一共有两面,加上一面hr,面试官都很随和,整体面试感觉还不错

面试问题

第一面

  • java的直接内存讲讲?
  • java类的加载过程
  • 讲讲抽象工厂
  • Node.js了解什么

第二面

  • 中间人攻击讲讲
  • https是怎么做的
  • linux内存管理
  • IoC注入过程,父类怎么办

hr面

  • 拼多多加班很多能接受么?
  • 你对于北方和南方会怎么考虑?

美团点评面试

面试岗位

后台开发工程师

面试体验

只有一面,感觉面试官对于我并不感兴趣,整体技术也偏C++,面试官人很随和,但是问题描述不清楚,耽误了一些时间,而且感觉导致他对我评价变低

面试问题

  • 有一堆IP地址范围,查找某个IP地址属于哪个IP地址范围
  • 网络字节序大小端,如何用代码判断是否为大小端
  • TCP四次挥手,TIME_WAIT,CLOSE_WAIT的理解
  • 哲学家就餐问题如何解决?

以 2018.08.28 为时间节点,我要开始好好找工作了!!!

阿里飞猪

面试岗位

JAVA开发工程师

面试体验

面试官电话来的很晚,基本是要睡觉了,可以感觉出来阿里的工作不轻松呀

面试问题

  • class存在哪儿,jvm结构
  • stringbuffer和stringbuilder的区别

腾讯笔试面试

面试岗位

后台开发工程师

面试体验

这次面试又发来了三道题,然后电话问了问项目,最后一道题还是好难啊

面试问题

注:进阶部分不一定要实现。
为了提高效率,可以在个人本地电脑的编译器上验证代码,并把解题代码和验证代码都贴上来。

1.对于一棵满二叉排序树深度为K,节点数为 2^K - 1 ;节点值为 1至 (2^K-1)。
给出K和任意三个节点的值,输出包含该三个节点的最小子树的根节点值
样例输入:4 10 15 13
样例输出:12

#include <string.h>
#include <errno.h>
#include <math.h>
#include <iostream>

using namespace std;

int main()
{
    freopen("/Users/guanpengchn/Code/test/c/data.txt","r",stdin);
    int K;
    while(cin>>K){
        int sum = (1<<K) - 1;
        int node[3];
        int link[100];
        int res=0;
        for(int i=0;i<3;i++){
            cin>>node[i];
            int root = (sum + 1)/2;
            int k = K-1;
            if(i==0){
                for(int j=0;j<K;j++){
                    link[j]=root;
                    if(root>node[i]){
                        root -= 1<< (k-1);
                    }else if(root < node[i]){
                        root += 1<< (k-1);
                    }else{
                        break;
                    }
                    k--;
                }
            }else{
                for(int j=0;j<K;j++){
                    if(link[j]==root && link[j]!=res){
                        res=link[j];
                    }else{
                        break;
                    }
                    if(root>node[i]){
                        root -= 1<< (k-1);
                    }else if(root < node[i]){
                        root += 1<< (k-1);
                    }
                    k--;
                }
            }
        }
        cout<<res<<endl;
    }
    return 0;
}

2.回形矩阵是由1开始的自然数顺时针排列成的一个n*n矩阵,n为奇数.

1   2   3   4   5
16  17  18  19  6
15  24  25  20  7
14  23  22  21  8
13  12  11  10  9

要求打印出它的一个子矩阵(m*m),例如在n=5的矩阵里面以起始点 xy( 2,2 ) 打印m = 2的正方形,则输出:
17,18
24,25

进阶: 是否可以应对超大规模的情况,例如n > 10000000,m<100的场景

#include <string.h>
#include <errno.h>
#include <math.h>
#include <iostream>

using namespace std;

int main()
{
    freopen("/Users/guanpengchn/Code/test/c/data2.txt","r",stdin);
    int n,x,y,m;
    while(cin>>n>>x>>y>>m){
        int index, i, j;
        int matrix[100][100];
        for(int i=0;i<100;i++){
            memset(matrix[i],0,100*sizeof(int));
        }
        i = j = 0;
        index = 1;
        while(index <= n*n){
            while(matrix[i][j] == 0 && j < n)
                matrix[i][j ++] = index ++;
            j --;
            i ++;

            while(matrix[i][j] == 0 && i < n)
                matrix[i++][j] = index ++;
            i --;
            j --;

            while(matrix[i][j] == 0 && j >= 0)
                matrix[i][j --] = index ++;
            j ++;
            i --;

            while(matrix[i][j] == 0 && i >= 0)
                matrix[i --][j] = index ++;
            i ++;
            j ++;
        }
        for(i=x-1; i<x-1+m; i++){
            for(j=y-1; j<y-1+m; j++){
                cout<<matrix[i][j]<<' ';
            }
            cout<<endl;
        }
    }
    return 0;
}

3。 一个页面有两个广告位,现有四个广告需要展示,实现一个算法输出需要展示的两个广告
要求:
a.输出的两个广告不能相同;
b.多次调用输出的四个广告的概率为:1:2:3:4 (4个广告用整形1-4来表示)
c.进阶:是否存在通用解,n个广告,概率为p1:p2:...:pn

#include <string.h>
#include <iostream>
#include <stdlib.h>
#include <time.h>
#include<vector>

using namespace std;


int gen(int n) {  // 在 [1, n] 区间等概率的选个 1 个随机数
    int res = 0;
    for(int i = 1; i <= n; i++) {
        if((rand() % i + 1) == i) {  // 产生一个 [1, i] 区间的随机数
            res = i;
        }
    }
    return res;
}

int sum[4]={0};
vector<int> save;
vector<int> a;

void solve() {  // num: 广告数
    int len = a.size();
    int pos1;
    int pos2;
    if(!save.empty()){
        pos1 = save.back();
        pos2 = gen(len);
    }else{
        pos1 = gen(len);
        pos2 = gen(len);
        if(a[pos1 - 1] == a[pos2 - 1])
            save.push_back(pos1);
    }
    while(a[pos1 - 1] == a[pos2 - 1]){
        save.push_back(pos2);
        pos2 = gen(len);
    }
    if(!save.empty())
        save.pop_back();

    sum[a[pos1 - 1]-1]++;
    sum[a[pos2 - 1]-1]++;
    cout << a[pos1 - 1] << ", " << a[pos2 - 1] << endl;
}


int main() {
    for(int i = 1; i <= 4; i++) {
        for(int j = 0; j < i; j++)
            a.push_back(i);
    }
    srand((unsigned)time(0));
    for(int i = 0; i < 10000; i++)
        solve();
    for(int i=0;i<4;i++){
        cout<<sum[i]<<' ';
    }
}

阿里飞猪

面试岗位

JAVA开发工程师

面试体验

面试官中午打的电话,简单问了问项目,可能是希望我去实习,这样稳妥一点

 阿里飞猪

面试岗位

JAVA开发工程师

面试体验

HR姐姐打电话过来问我的情况,整个过程没有压力面,感觉还是挺开心的

面试问题

  • 为什么会选择阿里巴巴?
  • 平时有什么爱好?
  • 想在哪个城市工作?
  • 在项目中收获是什么?协作中出现过什么问题么?
  • 未来的规划是什么?

 快手

面试岗位

JAVA开发工程师

面试体验

现场面试,结果还是只有一面,估计悬啦,和面试官讨论了很久算法题,过程就是我先去做然后面试官不断提示,到最后优化的地方自己思路还是卡住了

面试问题

  • 给出二叉树的节点数,构造一颗二叉树,要求树中所有节点要么有两个子节点,要么没有子节点,把所有这样的树存到一个List中
  • 给出一个链表,链表中有val,next和random,其中random指针会随机指向任意一个链表中的节点,问如何拷贝这样一个链表
  • synchronized了解么,和可重入锁的区别是什么?synchronized底层是怎么实现的?锁的种类有什么?

微策略

面试岗位

开发工程师

面试体验

我参加的是微策略的提前批沙龙,感觉做的很好,第一天是企业介绍和群体面试,玩了很多游戏,第二天是正式的面试,有两轮技术面和一轮final面试,如果面试的不好可能一轮就结束了,微策略公司让我觉得比较好的地方在于地处杭州,生活压力相对会小,同时保持了外企不加班的风格,还有就是作为美国的企业杭州是第二大开发总部,会有很多技术性的工作,和一些外企只把测试和技术支持放到国内是有区别的,感谢提供了两天的酒店住宿和往返路费报销,面试题目不可透漏,希望有更多同学去体验~~

 智者四海——知乎

笔试岗位

后台开发工程师

笔试题目

5道选择题,3道简答题和3道算法题,整体难度不大

图森未来

面试岗位

全栈开发工程师

面试体验

第一面主要是面了两道算法题,第二道题没想清楚,第二面是从项目和工程的角度来面试的,主要看我的知识面和能力吧,总体体验还挺好的,也是第一次面试全栈开发的岗位,和面试官讨论了一下如何理解全栈工程师的,为什么图森会有这样的岗位招聘

面试题目

  • 给出一个只包含abc的字符串,找出其中按照abc三个字母顺序可以匹配的子序列数量,比如abcc可以匹配2个abc
  • 给出一个树,每条路径都是1的权重,遍历完成树上所有节点后最小要走的路径是多少
  • 如何理解全栈,对于50,50的现象
  • HTTP状态码都有什么
  • 如果不使用锁如何既保障性能又保障准确性
  • 如果只有5分钟,数据库会过来100万访问量,怎么处理

腾讯

面试岗位

后台开发工程师

面试体验

没想到之前腾讯的面试进度变成GM/面委会之后果真回退成复试了,,,这还能回退,这次还是复试,加上这次已经四次了,这次没有做题问了很多C++的知识,被问的很晕

面试题目

  • 讲项目
  • 双向链表如何转二叉搜索树
  • C++多态底层是怎么实现的
  • sleep能到微妙级么,为什么
  • MySQL都有什么引擎,区别是什么?
  • MySQL主从是如何同步的
  • new是函数么,可以被重载么
  • linux为什么要分内核态和用户态
  • IPC通信方式,哪种系统资源消耗最少
  • 有三个桶,分别能装10升,7升,3升油,现在10升的桶装满,怎么能倒出来两个5升油

宜信

面试岗位

后台开发工程师

面试体验

一共两面,第一面面试不太好,很久不刷算法题了,很常见的题被问得很蒙,第二面问了很多简单的算法题,整体回答的还可以

面试题目

  • 求二叉树中两个节点的最近公共祖先节点
  • 用HashMap和ArrayList设计一个Set,要求实现add,delete,random函数

 网易游戏雷火

笔试岗位

平台研发工程师

笔试体验

其他的笔试没怎么写过体验,网易游戏的体验感还挺强,因为要去现场笔试,人挨着人,每一列都是不同的岗位,卷子也不一样,确实没办法抄袭,我去的那场卷子发的比较慢,定的是14:00-17:00笔试,但是卷子发了有半个小时,不过时间也向后延长了,题目是前60道题为不定项选择和填空,一道题一分,只要不是标准答案就没有分,2道简单题各8分,2道编程题各12分,总分100分

笔试题目

  • 前60道都是大学考试里的那种题目,没有复习的话很杂很难做
  • 简答题1:有A,B,C,D四个奖,每个观众可以抽奖三次,以抽到的最大奖为结果,从大到小为ABCD,要求最后抽到奖的概率为a%,b%,c%,d%,写一下如何实现
  • 简单题2:给出一个数独,要求写一下如何将空位填满
  • 编程题1:有a-j的布尔变量
    (1) 要求实现输入一个公式字符串,其中包含& | ! ( )这五个符号,同时输入a-j的布尔值数组,输出公式的计算结果,例如:输入字符串 a&(b|!c) 和数组 [true,false,true] 输出false

(2) 请统计有多少个个变量改变了bool值同时对整个公式没影响

  • 编程题2:给出一个数组,代表高度,求出来水坑的空间大小

网易游戏雷火

面试岗位

平台研发工程师

面试体验

电话面试,面试官非常随和,而且经常笑意满满,让我感觉通不过电话打得也挺开心的,哈哈,问了很多工程上的问题,基础的内容并没有特别多

面试题目

  • 如何设计登录功能
  • 如果传输json如何让服务端知道
  • MySQL的联合索引,如何查看执行流程调优
  • 了解node和typescript么
  • redis有哪些数据结构,可以用在哪些场景下

字节跳动

笔试岗位

后台开发工程师

笔试体验

题目挺难的,5道题只AC了2道,估计够呛有面试机会

网易游戏雷火

面试岗位

平台研发工程师

面试体验

面试的部门主要是写nodejs的,问的问题也基本都和js有关系,没有问算法题,主要是在讨论js,看我js的水平,然而我并没有准备,所以很多答的并不理想和准确

面试问题

  • 如果让你自己实现vue-router怎么做
  • Promise知道么,如何保证3个Promise按顺序调用
  • 解构是什么意思,对数组和对象解构的区别
  • CORS如何让客户端在发送的时候携带cookie
  • 如何避免跨脚本攻击

图森未来

面试岗位

全栈开发工程师

面试体验

在线写了两道算法题,第一个题很常规,第二个题就被难住了,然后问了问个人意愿想学什么包括想在哪儿工作

面试问题

  • 第一题

给出一个只有正数的数组,和目标值target,找到大于target的连续子数组最小和

//a[] 34 564 -7 23 76 -565 324 768 23 67
//target = 234
//l,r sum = a[l] + ..+a[r] >= x && minSum

int query(int a[], int x){
    if(a.length==0){
        return 0;
    }
    int minSum=0;
    int tmpSum=a[0];
    int front=0;
    int end=0;
    boolean flag=true;
    while(end<a.length){
        if((tmpSum<minSum||flag) && tmpSum>=x){
            flag=false;
            minSum = tmpSum;
            front++;
            if(front>end){
                end++;
            }
            tmpSum -= a[front-1];
        }else{
            end++;
            tmpsum += a[end];
        }
    }
    return minSum;
}
  • 第二题

如果数组中存在负数呢?

构建二叉搜索树,每个节点上都是从头开始的子数组和,再遍历数组,去加搜索树上的值,找到符合条件的值,遍历时间要nlogn

图森未来

面试岗位

全栈开发工程师

面试体验

主要问了问整体情况,还有一些知识点,讲了很多关于工作的内容

字节跳动

面试岗位

后台开发工程师

面试体验

一共三轮面试,考察的问题并不是很难,每轮都有code,难度不大,但是对code的检查都很仔细

面试问题

  • 反转链表
  • 两个栈实现队列的push,pop和count功能
  • 给出一个数组如 5,0,3,7,0,0,1 从0号下标位置出发,数组中的数表示能走到后面的最多位置,问走到最后一个位置最少需要几步
  • 给出一个字符串,其中的字母在a-zA-Z范围内,找出字符串在a-zA-Z范围内没出现过的字母
  • 上一题变形,如果现在数字的范围是0-2^32,给出一个300G的文件,里面每行都是一个数,内存只有1G,如何找到在数字范围内,没出现过的数
  • 有一份儿日志文件,每行都是一个日期,有序排列,请找出20:00-22:00的日志行
  • redis的基本数据结构有哪些?如何备份?
  • 数据库引擎有哪些?区别是什么?
  • 讲一下三次握手和四次挥手,写一下SYN和ACK的值
  • 进程间通信机制有哪些
  • Http协议有哪些状态码,跨域是怎么实现的

秋招投的基本都是Java研发岗,分享一下自己的复习策略

初级策略:看面经和刷题

如果是面试java开发的话,推荐JavaGuide这个仓库,里面覆盖的还比较全面

高级策略:看书和读源码

其实最开始我是拒绝看书的,因为觉得太慢,而且可能记不住,所以我使用了初级策略,但是在面试过程中有几件事情让我发现了秋招仅仅依靠面经是无法拿到大厂offer的

问题如下:

  1. 面试中让我实现HashMap的put函数伪代码,实现ThreadPoolExecutor的offer和take函数伪代码
  2. 大小端是什么样的,如何写代码判断,网络字节序c++和java会存在大小端转换问题么?
  3. 你对jvm看起来很了解,那双亲委派模型知道么?
  4. Spring的启动过程是怎么样的,用到了哪些类?
  5. 遇到大量wait_time状态怎么处理?

分析下上面几个问题,可以得到下面几个结论:

  1. 我面的都是java和后台研发的岗位,但是不可避免的会碰到c++的面试官问c++相关的面试问题,尤其是网络编程上;
  2. java面试如果仅仅看面经的话,遇到源码和更深入一层的问题基本顾及不到,而恰恰现在大厂的面试官都会去深入一步询问。

所以只看面经很容易被识别出来,然后被面试官吊打,我只举了面试过程中遇到的5个较深入的问题,还有更多的问题我没列出来,而且可以认为有几个问题没答出来,就少了几个offer,今年的面试已经很难有问题不会可以给offer的空间了。

基于上述结论我推荐几本我看过的书,都是豆瓣评分很高很经典的书籍,分别用于补充不同的部分,所有的书籍均可下载,下载链接,该推荐基于已经学过Java有一定编程能力的同志。

Java研发书籍:

推荐阅读顺序:

Java高并发程序设计 -> JDK -> 深入理解Java虚拟机 -> MySQL必知必会 -> Redis开发与运维 -> TCP/IP编程 -> 图解HTTP -> Head First 设计模式 -> Java 8实战 -> 大型网站技术架构 -> 高性能MySQL -> 其他

书籍详情:

  • JDK的collection,map,concurrent包必看
  • Java高并发程序设计:必看,面试中高并发几乎是必问的点,如果没有系统的看过高并发程序如何写,类库如何用很容易被问晕
  • 深入理解Java虚拟机:必看,经典中的经典,所有jvm和jmm相关的问题和知识都在这里有答案
  • MySQL必知必会:必看,内容为sql语句的基本使用,建议配合牛客网的数据库实战编程来复习
  • Redis开发与运维:必看,主要内容为Redis的使用和特点,讲解了Redis都有哪些可用的内容
  • TCP/IP编程:必看,书中虽然都是C++,但基本覆盖了网络编程能遇到的问题,包括IO使用,网络字节序等
  • 图解HTTP:必看,书很短一天就能看完,能很快的掌握http协议中的字段和含义,面试中也经常被问到
  • Head First 设计模式:选看,讲java设计模式的,其中单例模式的四种实现被问得最多
  • Java 8实战:选看,非常有价值的书籍,Java 8的新特性使得Java函数式编程成为了可能
  • 大型网站技术架构:必看,面试中常常会遇到秒杀系统设计一类的问题,这时候需要有对分布式系统演化的理解
  • 高性能MySQL:选看,内容为mysql的实现原理和性能优化,在面试中经常会被问到,读这本书会有更深刻的理解
  • 其他:还有很多进阶的书籍,比如Spring揭秘、Netty权威指南、Redis设计与实现等,这些都可以后续再看
建议:学一个工具的时候,需要准备两本书,第一本书是讲如何使用的,第二本书是讲内部原理的,建议先将第一本书看个大概,再去开始做项目,一边做一边巩固,同时开始学习实现原理。

更多精彩内容