From 329f3df151e40f36c552e6016ebb3de5c245a447 Mon Sep 17 00:00:00 2001 From: Zhuang Ma Date: Mon, 22 Oct 2018 15:35:03 +0800 Subject: [PATCH 01/55] fix link of chinese copywriting guidelines --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 258fa75d..cdd14ecc 100644 --- a/README.md +++ b/README.md @@ -182,7 +182,7 @@ #### Typesetting -笔记内容按照 [中文文案排版指北](http://mazhuang.org/wiki/chinese-copywriting-guidelines/) 进行排版,以保证内容的可读性。 +笔记内容按照 [中文文案排版指北](https://mazhuang.org/wiki/chinese-copywriting-guidelines/) 进行排版,以保证内容的可读性。 笔记不使用 `![]()` 这种方式来引用图片,而是用 `` 标签。一方面是为了能够控制图片以合适的大小显示,另一方面是因为 GFM 不支持 `
![]()
` 让图片居中显示,只能使用 `
` 达到居中的效果。 From f2c02d52076c69b97a48d9ce5dd5264a046b70e5 Mon Sep 17 00:00:00 2001 From: MckayRen <729022340@qq.com> Date: Fri, 26 Oct 2018 21:31:04 +0800 Subject: [PATCH 02/55] =?UTF-8?q?Update=20=E9=87=8D=E6=9E=84.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit typo 软 -> 使 --- notes/重构.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/notes/重构.md b/notes/重构.md index e90fa84e..d7e31bf8 100644 --- a/notes/重构.md +++ b/notes/重构.md @@ -383,7 +383,7 @@ class App { ## 重构与性能 -为了软代码更容易理解,重构可能会导致性能减低。 +为了使代码更容易理解,重构可能会导致性能减低。 在编写代码时,不用对性能过多关注,只有在最后性能优化阶段再考虑性能问题。 From 9f4fe4e0f3fb4b1be7de70f4c34df14d97b78b82 Mon Sep 17 00:00:00 2001 From: CyC2018 <1029579233@qq.com> Date: Tue, 30 Oct 2018 00:52:44 +0800 Subject: [PATCH 03/55] =?UTF-8?q?Update=202018=20=E8=BF=99=E4=B8=80?= =?UTF-8?q?=E5=B9=B4.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 2018 这一年.md | 115 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 115 insertions(+) create mode 100644 2018 这一年.md diff --git a/2018 这一年.md b/2018 这一年.md new file mode 100644 index 00000000..ebbbc7d9 --- /dev/null +++ b/2018 这一年.md @@ -0,0 +1,115 @@ +## 前言 + +2018,有过迷茫,有过努力,也有很多收获。为了记录这一年来的感受,于是有了这篇文章。 + +## Offer 情况 + +经过了长达一年左右的复习,最终也收到了几个满意的 Offer,参加面试的都通过了。 + +- 百度,企业智能平台; +- 阿里,高德地图高精地图部门,部门已联系,目前还在申报 Offer 中; +- 腾讯,IEG 游戏平台,后台研发,SP; +- 字节跳动,头条后台研发,SSP; +- 华为,Cloud Bu,十五级(未定); +- 网易游戏,梦幻事业部; +- 顺丰科技。 + +## 前期准备 + +也是在去年十一月份左右,看着身边两年制的同学经历了长时间而又艰难的秋招,我开始意识到自己应该开始提前准备了,否则自己的秋招会很惨。 + +本科的时候,虽然学过计算机网络、操作系统和数据结构等课程,而且 Leetcode 也刷了一两百题,但是离招聘要求还差的很远,学的都很浅只够应付考试,而且没有实际的项目经验。 + +我的研究生方向是计算机图形学,研究生期间主要是做一些科研项目。在选择招聘方向的时候,我也纠结了是不是找图形学相关方向的,但是考虑到图形学的选择不是很多,所以还是决定投后台研发相关的岗位。 + +于是开始收集各种学习资料,也买了很多纸质书。最开始的学习效率并不是很高,很迷茫,觉得要学的内容很多无从下手。那时候看别人的面经,感觉自己太弱了,很多内容都没接触过,于是更加迷茫。迷茫的时候总想着逃避,要是不复习多好,玩玩游戏每天多简单。但是游戏玩的越多,那种焦虑感越是强烈。解决焦虑的唯一办法就是想办法解决当前问题。当我慢慢地从消极的学习态度中调整过来,掌握的知识越多,那种焦虑感也随之消失。当然这个过程并不容易,不仅需要很好的毅力,也要根据自身情况找到问题的有效解决方法。 + +## 春招开始 + +三月份各个公司就开始春招了,那时候刚把一些基础知识简单地复习了一下,Leetcode 刷到了三四百题。但是后台研发相关的项目没有,因此就花了一个星期左右用 PHP 做了一个微博系统。当时做简历特别痛苦,没内容可以写,看着其他人简历各种新技术,自己都没掌握,所以很虚。 + +## 阿里一轮游 + +最开始投的阿里,实验室大几届有个师兄在天猫精灵团队,所以给我内推了。于是我人生中第一场面试就是阿里,很自然地被虐了一遍。记得当时约好下午两点面试,午饭都没吃,怕吃完之后犯困影响状态,然后找了一个很安静又没人的地方在那里呆到了两点。可是面试官突然打电话说有个会议要开,所以推迟了大概一个小时。苦苦等到三点左右,面试正式开始,不出所料面得非常糟糕。首先自己表述的很有问题,很多内容没回答到关键点上,而且自己会的内容也不怎么继续扩展回答。其次知识掌握得也不够,连线程安全、ThreadLocal、函数式编程都不会。虽然被虐的很惨,但是也有好处,知道了面试到底是怎样的,自己还有哪方面的不足,该怎么准备。 + +## 腾讯被鞭尸 + +第二场面试是腾讯,在经历了阿里的面试之后,并且又继续复习了一段时间,我对面试就比较有信心了。一面其实回答的挺理想的,虽然很多问题没有立马回答出来,但是经过面试官的耐心提示之后都能回答一些内容。当时面了一个半小时,面试体验特别好。印象比较深刻的题目有,阅读一个 Redis 源码,分析有哪些问题。其实就是一个计数器实现的限流算法,会有临界值的问题,但是当时没回答出来,只能听面试官给我解释。还有一个微信扫二维码,这个过程发生了什么,也没回答得很好,不过面试官也很耐心地纠正我回答上的错误。一面顺利通过了,但是总监面挂了。总监面没有问什么技术问题,就是问了问项目,然后自己的职业规划之类的。自己的项目确实比较 Low,我自己在介绍的时候也说得很不堪。职业规划我说自己希望在一些方面深入学习,因为自己现在在这些方面还很薄弱... 面完之后我就知道挂了,因为整个面试我都特别虚,还主动说自己技术能力不行。不出所料,面完的当天晚上,状态变成了不合适。 + +但是过了几天,突然收到腾讯的电话,问我是否愿意去深圳参加面试(笔者学校在广州)。当然我毫不犹豫地答应了,很开心腾讯还能给我机会。经过了上一场面试的启示,这次面试我表现地非常自信,自己知道的知识都很有自信地表达出来,被问到不会的内容也不会那么慌张,和面试官探讨一些细节,然后说说自己的想法,还有自己看过相关的内容。由于这是腾讯云部门,对 Linux 内核和 C++ 有很高的要求,问了几个相关的问题我都没回答出来,比如如何实现守护进程,Linux 信号机制,Linux 线程的不可中断阻塞状态如何进入等等。除了这些问题,其它地回答的都还行。遗憾的是,当天晚上面试官打电话告知我面试没通过。但是他说我其它方面都很不错,所以问我愿不愿意参加腾讯云 Java 部门的招聘,于是第二天我又去了一个新的部门面试。 + +这次面试是在部门的会议室进行的,进到公司之后说实话没有自己想象中那么好,工位很挤环境一般。一开始就先随便聊聊,学校的研究工作,学习之类的。然后看了看项目,看完之后我就知道凉了一半,这个项目确实太水了,面试官看了之后没有接着问,也能感受到面试官有点嫌弃。然后他就问了一些基础知识,问到进程调度算法,面试官让我实现一个任务调度系统。因为是第一次手写代码,而且之前确实没考虑过这个问题,然后就胡乱写了一堆代码,特别乱,而且到处涂改。显然面试官是不满意的,写了也有十几分钟之后,我自己都知道已经凉了,然后面试官没让我接着写,也没给我任何提示,说就到这里,面试结束了,还有没有什么问题想问的。当然看过任务调度系统相关的文章会觉得挺容易的,比如使用时间轮实现等等。我依然记得面试官送我出门时候的热情,送我到电梯的时候还很热情地和我说,非常感谢参加本次面试,麻烦了。 + +## 虎牙过于自信 + +经过了阿里和腾讯的面试之后,我觉得自己大概已经知道该怎么面试了,面试时候该注意什么,该怎么表达等等。而且腾讯面试表现也不差,虽然最后没通过。所以在虎牙面试的时候特别放松,觉得应该能通过。前面面的也都还行,虽然有几个问题没回答好,比如分析一下微博的时间线。通过了第一轮面试直接等第二轮,等到了晚上七点多才等到我。虎牙面试还是很注重技术的,虽然问的都不是很深入,只要简单回答到点上就不会接着问下去。二面也有一些问题没回答好,比如 ConcurrentHashMap 的并发机制,问 Spring 直接说不会。也有一些问题回答得比较乱,没有条理。但是我觉得大部分问题都回答的不错,应该能通过。可是面试完之后,面试官问有没有什么问题要问他,由于太过放松,我就问你们都加班到这么晚不吃饭吗,好饿啊,周六周日还加班吗... 问完之后面试官就很严肃了,说平常不加班的,然后我突然意识到问题的严重性... 最后还是凉了。 + +## 百度第一个 Offer + +被三家连续拒了之后,都开始怀疑自己了,不过还是提醒自己要保持信心。 + +幸运的是,百度的面试非常适合我,三轮都是技术面,而且手写算法题目居多,而我准备最多的是算法,所以很顺利通过了面试。但是面试表现并没有特别好,过了比较长的时间才被捞,而且是工程效率部门,做内部工具的,对个人成长并不好,所以不是特别满意。 + +## 网易游戏最好的面试体验 + +其实最开始没有打算投网易游戏的,因为被脉脉洗脑,已经放弃了做游戏。但是因为前面面试基本被拒了,担心没有实习 Offer,因此就试试看。 + +因为没有特别想去网易游戏,所以面试过程也比较放松,就当去聊聊天。面试官非常 nice,那天下午挤了很久地铁,比较口渴,然后面试官看我说得沙哑了,到门口帮我买了一瓶可乐,非常感激。面试之前我就提出我对 C++ 不熟悉,最近主要看 Java 的内容。面试官还是说没关系,尽量回答就好。当然最后我都把问题往 Java 那里回答了,比如 Map 的实现,内存管理等等。最后聊了一些玩过的游戏,就让我回去等消息。网易游戏就一轮面试,确实就一轮。周五参加的面试,下周一就给 Offer 了,效率特别高。 + +## 微众玄学面试 + +通过微众面试我自己都非常吃惊,一面的时候就简单自我介绍了一下,然后面试官开始介绍他自己的工作经历,以及现在部门在做的内容。之后问了我一个场景分析问题,我想了一会儿没想出来,于是面试官拿起草稿纸把各种需求详细说了一遍,然后把系统架构图也画了出来... 最后他问还有什么我优势的地方他没问到的,我问他怎么不问问算法题,他说笔试都通过了没必要再问。面完之后我觉得聊得很开心,但是技术问题没回答好,出乎意料收到了二面通知。二面没问技术,就让介绍了项目,再问问家住哪之类的问题,也顺利通过了。HR 面就不用介绍。收到了微众的 Offer,得知了部门是贷款科技部,非常核心,很吃香,近几年也在扩展一些业务,还是有点小心动的。虽然最后没选择去微众实习,但是一面面试官加了我微信,我很感谢他一面非常耐心给我讲解,并让我通过。他说我是他面试的第一顺位,也就是第一个面试者,所以会放宽很多,也希望我秋招能加入他们。 + +## 实习选择 + +其实最理想的是去百度实习,秋招也会容易很多。但是考虑到百度是在北京,部门很边缘,而且需要实习很长时间也不一定能转正,所以还是放弃了。最后只能在网易游戏和微众选,虽然自己不想做游戏,但是考虑到网易游戏的平台认可程度比微众好,秋招肯定会更容易一些。而且秋招如果还想进微众的话也会比较容易,因为面试官和 HR 都说秋招的时候会优先考虑我,所以最后还是去了网易游戏实习。 + +## 不那么安心的实习 + +去实习的时候还是挺惊喜的,因为我被安排的工作是游戏引擎相关的,和自己的研究生方向紧密相关,所以我觉得做完实习项目之后自己的毕业论文也会比较有灵感。但不幸的是,在去的第一天部门接待聚餐上,服务端主程就说,我们部门工作制是九九六,现在互联网都是九九六。在实习之前我了解的是实习生六点就可以走,而且只用上五天班,听到他这么一说心都凉透了,因为已经想好了晚上和周末要拿来复习。如果知道是九九六,我会选择去百度。 + +其实网易游戏部门氛围还是不错的,对员工很好,而且我的实习导师人也很好,在我生病的那几天很关心我。但是九九六的工作时长对秋招复习还是有很大影响的,而且每天去公司花在路上的时间超过了两个小时,下班回寝室之后总想着看会儿视频休息一下,然后又要早早睡觉赶着第二天上班。没办法只能在上下班地铁上复习,还有就是午休时间接着复习。 + +实习之后已经是九月份了,那时候已经错过了所有提前批。而且实习的时候没怎么复习,九月初还是感觉没怎么准备充分,所以就又等了半个月才开始投简历。 + +## 阿里搞不懂的内部流程 + +秋招第一个投递的依然是阿里,最开始系统自动发起了一个新的流程,然后过了几天自动回绝了... 八月末的时候也找人内推了,但是又被阿里直接回绝了... 那时候已经觉得可能是春招面试表现太差,此生无缘阿里了。可是过了一段时间,正式校招的时候,阿里又发起了一个新的流程戏弄我,收到笔试通知的时候,我还犹豫了到底参不参加,因为那时候已经九月中旬,听说阿里已经没有 HC 了。而且按前面回绝我的态度,感觉即使笔试通过面试也通过不了。笔试那天晚上,本来准备找个电影放松一下,后来想了想还是参加了笔试,笔试各种机器学习和数学题,感觉拿错了试卷,笔试完我已经把阿里从我的公司进度列表中删除了,不再纠结阿里。可是过了一段时间又收到阿里的面试通知,我以为是走走形式,可能参加笔试的人很少了,所以才选中我参加面试。那时候阿里招聘官网状态一排的已回绝,让我对阿里有一种恐惧感,觉得面试肯定挂。但是真正面试的时候意外的顺利,收到二面通知的时候特别激动,然后面完二面又让直接等 HR 面,HR 面虽然不是很理想,但是没有很大的问题。又过了很长一段时间,在我去深圳参加腾讯招聘的高铁上,收到了高德地图 HR 的电话,问是否愿意去。虽然得知部门在北京有点小失落,但是还是很开心终于被阿里认可了,摆脱了对阿里的恐惧。 + +实验室上届毕业在阿里云的大佬某天突然和我说,他们部门有新的 HC,让我把简历发给他,他要帮我内推,会帮我安排一场线下面试,如果通过的话,到时候和高德的 HR 沟通一下,直接把我从高德捞过来。很感谢大佬向他老大极力推荐我,给我了这次面试机会。线下面试也很顺利,聊聊实习项目,问问我的开源博客,然后问些 Paxos 等分布式的问题,还有就是手写代码,信号量实现生产者消费者,以及一个位运算的问题。其实位运算的问题面试的时候写的不完善,面试官让我之后完善了再发给他,因为面试一个多小时有点长了。过后我写了详细文档讲解了思路,以及用 JUnit 进行了详细的单元测试,把文档和代码都发给了他。现在面试已经通过了,但是最近阿里集团 HC 比较紧张,也不知道能不能批到 HC。 + +## 百度又是不那么让人满意的部门 + +虽然阿里是最先开始流程,但是第一个参加面试的是百度。因为实习的时候通过了百度的面试,所以这次面试还是比较有信心的。百度面试连续三天,都在同一个地方,最后签约也在同一个地方,还记得每次都坐一个小时左右的地铁去那里,路线已经非常熟悉了,和每天去实习的感觉类似。百度面试比较注重技术,三轮面试基本都是问技术问题,而且问的也比较深入,内容也非常广。但是面的不是那么理想,有两点原因,首先是因为确实有些知识点还没掌握好,比如 AC 自动机,系统故障分析等等;其次是对实习项目的描述上还不够好,没有把实习内容的闪光点描述出来,也没有讲清楚为什么做这个项目,自己通过什么方法去做,以及最后的结果。 + +最后百度给了白菜价,部门是企业智能平台,主要是内部系统,虽然会接触到机器学习和大数据。 + +## 腾讯虐我千百遍 + +秋招腾讯第一场面试和实习参加腾讯面试的感觉非常像,第一轮技术面感觉很好,手写堆排序算法,二部图分析等等。面完之后通知待会儿二面,听到之后还是很激动的,觉得这次应该没问题了。我在等二面的时候,碰到了室友(他经常不住宿舍,所以不清楚他也去面试),聊着聊着居然发现我两是同一个面试官,而且他是来二面的,也就是等一下我两就要一前一后进去面试。二面的感觉和实习二面非常像,非技术问题回答的支支吾吾,然后面试官开始质疑我说的内容,给我压力,我没有当场反驳,就说了哦,好像是这样的。因为面试官全程都绷着脸,所以我也比较紧张,很多问题没回答好。面完之后我也意识到了这个问题,然后开始练习自己回答那些非技术面试问题的表达能力,经常在镜子前面对一个问题进行回答。过了几天,室友和我说收到 HR 面试通知了,我去官网看了一下状态,已经变成了熟悉的不合适。 + +因为实习有被捞起来的经历,所以被拒之后我特别希望能继续被捞起来,然后把简历上的面试城市改成了深圳。苦苦等到深圳场面试的前几天,在不经意的一个下午手机突然响了,我记得是短信邮件同时收到面试通知。于是又开始了新一轮被腾讯虐的面试之旅。 + +一面和之前一样也是意外地顺利,虽然问了一些 C++ 的问题,但是我都说到 Java 相关的实现上。在一些问题上确实回答的深度不够,比如网络编程里面的水平触发和边缘触发等问题。然后问了几个算法,本来要求手写,我说我实现过,所以就讲了讲思路。面试和腾讯第一场面试一样持续了一个半小时,面试官也很好,很多问题都会给提示,即使最开始回答的有问题。二面面试官也很好,问了问实习项目,然后再聊一聊一些技术,经过了之前的面试,到这次面试真的就像在聊天一样而不是面试,我们都会说一些对技术上的理解。HR 面其实面得很差,对于非技术问题的吹水能力我还是不太行。最终和我预期的一样,给了我 SP 的 Offer,因为觉得自己面得还可以,但是也不够好到给 SSP,有些 C++ 问题还是没回答的特别好。 + +## 头条意外的惊喜 + +之前看到学弟收到头条的 Offer,薪资非常诱人,所以也想去试试。也听说头条面试难度非常大,主要考察手写算法,因为自己算法方面准备得比较充分,所以觉得会比较顺利,但是也没有特别高的预期。前两面中规中矩,算法题和其它问题我都回答的比较好,到三面的时候,最开始问了一个错排问题,其实最开始我给了正确的递推公式,但不是面试官想要的答案,所以让我再想想,我想了十几分钟还是觉得没问题,那时候觉得自己已经凉了,因为面试官一直不满意。后面的几个问题也没回答的很好,分析一个 SQL 语句的具体执行过程,比如会怎么利用索引,怎么优化之类的,虽然在他的提示下还是回答了,但是感觉并不好。面完之后我立马查了一下那个错排问题,证实了我的答案是正确的,于是写了一个详细的文档,联系 HR 让她发给面试官。出乎意料的是,HR 让我不用担心,他说面试官对我的评价很好... 不过最后还是让她把文档发给了面试官。之后收到了加面通知,头条加面有两种情况,一是三轮评级都是 4 可以评 SSP,二是面试官评价差别很大,再面一轮决定是否录用。收到加面的时候完全不知道自己属于哪一种,感觉两种情况都有可能。加面回答的也不好,主要是问项目,面了 25 分钟就草草结束,最后面试官说有些内容需要找一些文献参考参考。面完之后我觉得,即使我属于第一种要评 SSP 的情况,加面面的那么差应该也没希望了。苦苦等了好多天之后,最后确定是 SSP 之后,还是很惊喜的,感觉是对自己这么长时间复习的一个认可。 + +## 顺丰最后的后路 + +投顺丰是因为九月中旬很多公司都结束了招聘,所以那时候比较慌,就投了顺丰当做保底,顺便也练练手。最开始还担心顺丰笔试没通过,因为编程题最后一题没做出来,那题的题目都出错了,而且题目是网上直接 copy 过来的,网上的源码都不能通过,更别说我自己的实现了。顺丰面试主要问了数据库的内容,而且问的特别深,几乎把每种日志的实现和作用都问了一遍。面顺丰的时候也比较早,那时候有些问题的回答上没有组织好,回答得比较凌乱,虽然最后也算给了一个小 SP。 + +## 华为特别纠结的部门 + +去华为面试确实是没有压力的,因为都知道华为面试不怎么问技术,虽然还是问了我一些技术问题,不过不是问的很深。面试主要介绍项目,我对自己的实习项目还是比较有信心的,因为觉得做的确实不错,而且面了很多场了,知道该怎么介绍项目。面试官问我个人意愿,我说自己对分布式中间件等比较感兴趣,于是面试官把我推荐到了 Cloud Bu。本来没打算签华为的,现场签约也就去看看到底给我开多少。最开始其实给我开了十四级最高的薪资,我本来不是很想去,虽然对这个部门感兴趣,但是薪资确实比不上头条。然后随口问了一句可不可以给十五级,HR 居然很爽快地说可以,但是只在绩效加 1k... 我都怕了,要是真给十五级确实很有吸引力,股票分红之类的,而且华为也在大力发展这个部门,所以突然就很纠结了。 + +## 小结 + +很多人都说,面试和考试一样,要背很多没用的东西。最开始我也认同这种看法,可是参加了几场面试之后,我就不这么认为了。因为面试出的问题,有很多是实际开发中碰到的,所以准备面试相当于提前做入职准备。而且面试中考察的思维能力、交流表达能力、应对压力能力,都是真正工作中所需要的。 + +我觉得自己比别人做的好的地方是,有很强烈的想找到好工作的意愿,才驱使我不断学习,所以态度很重要。 + +信心源自于充分准备,有了信心,面试的时候才能游刃有余。而毫无依据的自我良好,在每次失败之后都看不到自身的不足,而是怪外界的因素。 + +做好自己的简历,我在简历上花了很长时间,只要允许,我都会用这个简历给面试官演示:[个人简历](https://cyc2018.github.io) \ No newline at end of file From 0d9e88cb5e27537e877833fac06ea6626b2e1372 Mon Sep 17 00:00:00 2001 From: CyC2018 <1029579233@qq.com> Date: Tue, 30 Oct 2018 01:15:49 +0800 Subject: [PATCH 04/55] =?UTF-8?q?Update=202018=20=E8=BF=99=E4=B8=80?= =?UTF-8?q?=E5=B9=B4.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 2018 这一年.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/2018 这一年.md b/2018 这一年.md index ebbbc7d9..6ccc55bf 100644 --- a/2018 这一年.md +++ b/2018 这一年.md @@ -102,7 +102,7 @@ ## 华为特别纠结的部门 -去华为面试确实是没有压力的,因为都知道华为面试不怎么问技术,虽然还是问了我一些技术问题,不过不是问的很深。面试主要介绍项目,我对自己的实习项目还是比较有信心的,因为觉得做的确实不错,而且面了很多场了,知道该怎么介绍项目。面试官问我个人意愿,我说自己对分布式中间件等比较感兴趣,于是面试官把我推荐到了 Cloud Bu。本来没打算签华为的,现场签约也就去看看到底给我开多少。最开始其实给我开了十四级最高的薪资,我本来不是很想去,虽然对这个部门感兴趣,但是薪资确实比不上头条。然后随口问了一句可不可以给十五级,HR 居然很爽快地说可以,但是只在绩效加 1k... 我都怕了,要是真给十五级确实很有吸引力,股票分红之类的,而且华为也在大力发展这个部门,所以突然就很纠结了。 +去华为面试确实是没有压力的,因为都知道华为面试不怎么问技术,虽然还是问了我一些技术问题,不过不是问的很深。面试主要介绍项目,我对自己的实习项目还是比较有信心的,因为觉得做的确实不错,而且面了很多场了,知道该怎么介绍项目。面试官问我个人意愿,我说自己对分布式中间件等比较感兴趣,于是面试官把我推荐到了 Cloud Bu。本来没打算签华为的,现场签约也就去看看到底给我开多少。最开始其实给我开了十四级最高的薪资,我本来不是很想去,虽然对这个部门感兴趣,但是薪资确实比不上头条。然后随口问了一句可不可以给十五级,HR 居然很爽快地说可以,但是只在绩效加 1k... 我都怕了,要是真给十五级确实很有吸引力,股票分红之类的,而且华为也在大力发展这个部门,所以突然就很纠结了。当然升一级需要部门讨论之后才能确定,但是我后面说了我有很多 Offer,她也对我这些 Offer 很满意,大概率能评上,但是薪资涨得不多。 ## 小结 From 3ba1cd04326687647203c5be1877bd4e8d599197 Mon Sep 17 00:00:00 2001 From: CyC2018 <1029579233@qq.com> Date: Tue, 30 Oct 2018 02:35:14 +0800 Subject: [PATCH 05/55] =?UTF-8?q?Update=202018=20=E8=BF=99=E4=B8=80?= =?UTF-8?q?=E5=B9=B4.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 2018 这一年.md | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/2018 这一年.md b/2018 这一年.md index 6ccc55bf..f448dddb 100644 --- a/2018 这一年.md +++ b/2018 这一年.md @@ -6,19 +6,19 @@ 经过了长达一年左右的复习,最终也收到了几个满意的 Offer,参加面试的都通过了。 -- 百度,企业智能平台; -- 阿里,高德地图高精地图部门,部门已联系,目前还在申报 Offer 中; -- 腾讯,IEG 游戏平台,后台研发,SP; -- 字节跳动,头条后台研发,SSP; -- 华为,Cloud Bu,十五级(未定); -- 网易游戏,梦幻事业部; -- 顺丰科技。 +* 百度,企业智能平台; +* 阿里,高德地图高精地图部门,部门已联系,目前还在申报 Offer 中; +* 腾讯,IEG 游戏平台,后台研发,SP; +* 字节跳动,头条后台研发,SSP; +* 华为,Cloud Bu,十五级(未定); +* 网易游戏,梦幻事业部; +* 顺丰科技。 ## 前期准备 -也是在去年十一月份左右,看着身边两年制的同学经历了长时间而又艰难的秋招,我开始意识到自己应该开始提前准备了,否则自己的秋招会很惨。 +也是在去年十一月份左右,看着身边两年制的同学经历了长时间而又艰难的秋招,我开始意识到自己应该提前准备了,否则自己的秋招会很惨。 -本科的时候,虽然学过计算机网络、操作系统和数据结构等课程,而且 Leetcode 也刷了一两百题,但是离招聘要求还差的很远,学的都很浅只够应付考试,而且没有实际的项目经验。 +本科的时候,虽然学过计算机网络、操作系统和数据结构等课程,而且 Leetcode 也刷了一两百题,但是离招聘要求还差的很远,学的都很浅只够应付考试,也没有实际的项目经验。 我的研究生方向是计算机图形学,研究生期间主要是做一些科研项目。在选择招聘方向的时候,我也纠结了是不是找图形学相关方向的,但是考虑到图形学的选择不是很多,所以还是决定投后台研发相关的岗位。 @@ -30,7 +30,7 @@ ## 阿里一轮游 -最开始投的阿里,实验室大几届有个师兄在天猫精灵团队,所以给我内推了。于是我人生中第一场面试就是阿里,很自然地被虐了一遍。记得当时约好下午两点面试,午饭都没吃,怕吃完之后犯困影响状态,然后找了一个很安静又没人的地方在那里呆到了两点。可是面试官突然打电话说有个会议要开,所以推迟了大概一个小时。苦苦等到三点左右,面试正式开始,不出所料面得非常糟糕。首先自己表述的很有问题,很多内容没回答到关键点上,而且自己会的内容也不怎么继续扩展回答。其次知识掌握得也不够,连线程安全、ThreadLocal、函数式编程都不会。虽然被虐的很惨,但是也有好处,知道了面试到底是怎样的,自己还有哪方面的不足,该怎么准备。 +最开始投的阿里,实验室大几届有个师兄在天猫精灵团队,所以给我内推了。于是我人生中第一场面试就是阿里,很自然地被虐了一遍。记得当时约好下午两点电话面试,午饭都没吃,怕吃完之后犯困影响状态,然后找了一个很安静又没人的地方呆到了两点,调整自己的状态。可是面试官突然打电话说有个会议要开,所以推迟了大概一个小时。苦苦等到三点左右,面试正式开始,不出所料面得非常糟糕。首先自己表述的很有问题,很多内容没回答到关键点上,而且自己会的内容也不怎么继续扩展回答。其次知识掌握得确实不够,连线程安全、ThreadLocal、函数式编程都不会。虽然被虐的很惨,但是也有好处,知道了面试到底是怎样的,自己还有哪方面的不足,该怎么准备。 ## 腾讯被鞭尸 @@ -38,7 +38,7 @@ 但是过了几天,突然收到腾讯的电话,问我是否愿意去深圳参加面试(笔者学校在广州)。当然我毫不犹豫地答应了,很开心腾讯还能给我机会。经过了上一场面试的启示,这次面试我表现地非常自信,自己知道的知识都很有自信地表达出来,被问到不会的内容也不会那么慌张,和面试官探讨一些细节,然后说说自己的想法,还有自己看过相关的内容。由于这是腾讯云部门,对 Linux 内核和 C++ 有很高的要求,问了几个相关的问题我都没回答出来,比如如何实现守护进程,Linux 信号机制,Linux 线程的不可中断阻塞状态如何进入等等。除了这些问题,其它地回答的都还行。遗憾的是,当天晚上面试官打电话告知我面试没通过。但是他说我其它方面都很不错,所以问我愿不愿意参加腾讯云 Java 部门的招聘,于是第二天我又去了一个新的部门面试。 -这次面试是在部门的会议室进行的,进到公司之后说实话没有自己想象中那么好,工位很挤环境一般。一开始就先随便聊聊,学校的研究工作,学习之类的。然后看了看项目,看完之后我就知道凉了一半,这个项目确实太水了,面试官看了之后没有接着问,也能感受到面试官有点嫌弃。然后他就问了一些基础知识,问到进程调度算法,面试官让我实现一个任务调度系统。因为是第一次手写代码,而且之前确实没考虑过这个问题,然后就胡乱写了一堆代码,特别乱,而且到处涂改。显然面试官是不满意的,写了也有十几分钟之后,我自己都知道已经凉了,然后面试官没让我接着写,也没给我任何提示,说就到这里,面试结束了,还有没有什么问题想问的。当然看过任务调度系统相关的文章会觉得挺容易的,比如使用时间轮实现等等。我依然记得面试官送我出门时候的热情,送我到电梯的时候还很热情地和我说,非常感谢参加本次面试,麻烦了。 +这次面试是在部门的会议室进行的,进到公司之后说实话没有自己想象中那么好,工位很挤环境一般。一开始就先随便聊聊,学校的研究工作,学习之类的。然后看了看项目,看完之后我就知道凉了一半,这个项目确实太水了,面试官看了之后没有接着问,也能感受到面试官有点嫌弃。然后他就问了一些基础知识,问到进程调度算法,面试官让我实现一个任务调度系统。因为是第一次手写代码,而且之前确实没考虑过这个问题,然后就胡乱写了一堆代码,特别乱,而且到处涂改。显然面试官是不满意的,写了也有十几分钟之后,我自己都知道已经凉了,然后面试官没让我接着写,也没给我任何提示,说就到这里,面试结束了,还有没有什么问题想问的。当然看过任务调度系统相关的文章会觉得挺容易的,比如使用时间轮实现等等。我依然记得面试官送我出门时候的热情,送我到电梯的时候还很热情地和我说,非常感谢参加本次面试,辛苦了。 ## 虎牙过于自信 @@ -94,15 +94,15 @@ ## 头条意外的惊喜 -之前看到学弟收到头条的 Offer,薪资非常诱人,所以也想去试试。也听说头条面试难度非常大,主要考察手写算法,因为自己算法方面准备得比较充分,所以觉得会比较顺利,但是也没有特别高的预期。前两面中规中矩,算法题和其它问题我都回答的比较好,到三面的时候,最开始问了一个错排问题,其实最开始我给了正确的递推公式,但不是面试官想要的答案,所以让我再想想,我想了十几分钟还是觉得没问题,那时候觉得自己已经凉了,因为面试官一直不满意。后面的几个问题也没回答的很好,分析一个 SQL 语句的具体执行过程,比如会怎么利用索引,怎么优化之类的,虽然在他的提示下还是回答了,但是感觉并不好。面完之后我立马查了一下那个错排问题,证实了我的答案是正确的,于是写了一个详细的文档,联系 HR 让她发给面试官。出乎意料的是,HR 让我不用担心,他说面试官对我的评价很好... 不过最后还是让她把文档发给了面试官。之后收到了加面通知,头条加面有两种情况,一是三轮评级都是 4 可以评 SSP,二是面试官评价差别很大,再面一轮决定是否录用。收到加面的时候完全不知道自己属于哪一种,感觉两种情况都有可能。加面回答的也不好,主要是问项目,面了 25 分钟就草草结束,最后面试官说有些内容需要找一些文献参考参考。面完之后我觉得,即使我属于第一种要评 SSP 的情况,加面面的那么差应该也没希望了。苦苦等了好多天之后,最后确定是 SSP 之后,还是很惊喜的,感觉是对自己这么长时间复习的一个认可。 +之前看到学弟收到头条的 Offer,薪资非常诱人,所以也想去试试。也听说头条面试难度非常大,主要考察手写算法,因为自己算法方面准备得比较充分,所以觉得会比较顺利,但是也没有特别高的预期。前两面中规中矩,算法题和其它问题我都回答的比较好,到三面的时候,问了一个错排问题,其实最开始我给了正确的递推公式,但不是面试官想要的答案,所以让我再想想。我想了十几分钟还是觉得没问题,那时候觉得自己已经凉了,因为面试官一直不满意。后面的几个问题也没回答的很好,分析一个 SQL 语句的具体执行过程,比如会怎么利用索引,怎么优化之类的,虽然在他的提示下还是回答了,但是感觉并不好。面完之后我立马查了一下那个错排问题,证实了我的答案是正确的,于是写了一个详细的文档,联系 HR 让她发给面试官。出乎意料的是,HR 让我不用担心,他说面试官对我的评价很好... 不过最后还是让她把文档发给了面试官。之后收到了加面通知,头条加面有两种情况,一是三轮评级都是 4 可以评 SSP,二是面试官评价差别很大,再面一轮决定是否录用。收到加面的时候完全不知道自己属于哪一种,感觉两种情况都有可能。加面回答的也不好,主要是问项目,面了 25 分钟就草草结束,后最后面试官说有些内容需要找一些文献参考参考。面完之我觉得,即使我属于第一种要评 SSP 的情况,加面面的那么差应该也没希望了。苦苦等了好多天之后,最后确定是 SSP 之后,还是很惊喜的,感觉是对自己这么长时间复习的一个认可。 -## 顺丰最后的后路 +## 顺丰最后的保底 投顺丰是因为九月中旬很多公司都结束了招聘,所以那时候比较慌,就投了顺丰当做保底,顺便也练练手。最开始还担心顺丰笔试没通过,因为编程题最后一题没做出来,那题的题目都出错了,而且题目是网上直接 copy 过来的,网上的源码都不能通过,更别说我自己的实现了。顺丰面试主要问了数据库的内容,而且问的特别深,几乎把每种日志的实现和作用都问了一遍。面顺丰的时候也比较早,那时候有些问题的回答上没有组织好,回答得比较凌乱,虽然最后也算给了一个小 SP。 ## 华为特别纠结的部门 -去华为面试确实是没有压力的,因为都知道华为面试不怎么问技术,虽然还是问了我一些技术问题,不过不是问的很深。面试主要介绍项目,我对自己的实习项目还是比较有信心的,因为觉得做的确实不错,而且面了很多场了,知道该怎么介绍项目。面试官问我个人意愿,我说自己对分布式中间件等比较感兴趣,于是面试官把我推荐到了 Cloud Bu。本来没打算签华为的,现场签约也就去看看到底给我开多少。最开始其实给我开了十四级最高的薪资,我本来不是很想去,虽然对这个部门感兴趣,但是薪资确实比不上头条。然后随口问了一句可不可以给十五级,HR 居然很爽快地说可以,但是只在绩效加 1k... 我都怕了,要是真给十五级确实很有吸引力,股票分红之类的,而且华为也在大力发展这个部门,所以突然就很纠结了。当然升一级需要部门讨论之后才能确定,但是我后面说了我有很多 Offer,她也对我这些 Offer 很满意,大概率能评上,但是薪资涨得不多。 +去华为面试确实是没有压力的,因为都知道华为面试不怎么问技术,虽然还是问了我一些技术问题,不过不是问的很深。面试主要介绍项目,我对自己的实习项目还是比较有信心的,因为觉得做的确实不错,而且面了很多场了,知道该怎么介绍项目。面试官问我个人意愿,我说自己对分布式中间件等比较感兴趣,于是面试官把我推荐到了 Cloud Bu。本来没打算签华为的,现场签约也就去看看到底给我开多少。最开始其实给我开了十四级最高的薪资,我本来不是很想去,虽然对这个部门感兴趣,但是薪资确实比不上头条。然后随口问了一句可不可以给十五级,HR 居然很爽快地说可以,但是只在绩效加 1k... 我都怕了,要是真给十五级确实很有吸引力,股票分红之类的,而且华为也在大力发展这个部门,所以突然就很纠结了。当然升一级需要部门讨论之后才能确定,但是我后面说了我有很多 Offer 可以选择,她也对我这些 Offer 很满意,大概率能评上,但是薪资涨得不多。 ## 小结 From c86f7e82ba555be16be4aee24c5a7a7ae54924fb Mon Sep 17 00:00:00 2001 From: chenxiange <507815032@qq.com> Date: Tue, 30 Oct 2018 11:50:12 +0800 Subject: [PATCH 06/55] =?UTF-8?q?=E9=94=99=E5=88=AB=E5=AD=97=E4=BF=AE?= =?UTF-8?q?=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit CyclicBarrier小结的awati修改为await --- notes/Java 并发.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/notes/Java 并发.md b/notes/Java 并发.md index 8b26ae91..cc2c28a9 100644 --- a/notes/Java 并发.md +++ b/notes/Java 并发.md @@ -766,7 +766,7 @@ run..run..run..run..run..run..run..run..run..run..end 用来控制多个线程互相等待,只有当多个线程都到达时,这些线程才会继续执行。 -和 CountdownLatch 相似,都是通过维护计数器来实现的。线程执行 await() 方法之后计数器会减 1,并进行等待,直到计数器为 0,所有调用 awati() 方法而在等待的线程才能继续执行。 +和 CountdownLatch 相似,都是通过维护计数器来实现的。线程执行 await() 方法之后计数器会减 1,并进行等待,直到计数器为 0,所有调用 await() 方法而在等待的线程才能继续执行。 CyclicBarrier 和 CountdownLatch 的一个区别是,CyclicBarrier 的计数器通过调用 reset() 方法可以循环使用,所以它才叫做循环屏障。 From 489142344d6741b1f7a50ec615e560a76c0ef253 Mon Sep 17 00:00:00 2001 From: CyC2018 <1029579233@qq.com> Date: Tue, 30 Oct 2018 12:20:28 +0800 Subject: [PATCH 07/55] =?UTF-8?q?Update=202018=20=E8=BF=99=E4=B8=80?= =?UTF-8?q?=E5=B9=B4.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 2018 这一年.md | 54 +++++++++++++++++++++++++++++++++----------------- 1 file changed, 36 insertions(+), 18 deletions(-) diff --git a/2018 这一年.md b/2018 这一年.md index f448dddb..1ede56eb 100644 --- a/2018 这一年.md +++ b/2018 这一年.md @@ -1,13 +1,13 @@ ## 前言 -2018,有过迷茫,有过努力,也有很多收获。为了记录这一年来的感受,于是有了这篇文章。 +2018,有过迷茫,有过努力,也有很多收获。为了记录这一年以来的感受,于是有了这篇文章。 ## Offer 情况 -经过了长达一年左右的复习,最终也收到了几个满意的 Offer,参加面试的都通过了。 +经过了长达一年左右的复习,秋招也收到了几个比较满意的 Offer,参加面试的都通过了。 * 百度,企业智能平台; -* 阿里,高德地图高精地图部门,部门已联系,目前还在申报 Offer 中; +* 阿里,高德地图,部门已联系,目前还在申报 Offer 中; * 腾讯,IEG 游戏平台,后台研发,SP; * 字节跳动,头条后台研发,SSP; * 华为,Cloud Bu,十五级(未定); @@ -20,25 +20,25 @@ 本科的时候,虽然学过计算机网络、操作系统和数据结构等课程,而且 Leetcode 也刷了一两百题,但是离招聘要求还差的很远,学的都很浅只够应付考试,也没有实际的项目经验。 -我的研究生方向是计算机图形学,研究生期间主要是做一些科研项目。在选择招聘方向的时候,我也纠结了是不是找图形学相关方向的,但是考虑到图形学的选择不是很多,所以还是决定投后台研发相关的岗位。 +我的研究生方向是计算机图形学,研究生期间主要做一些科研项目。在选择招聘方向的时候,我也纠结了是不是找图形学相关方向的,但是考虑到图形学的选择不是很多,所以还是决定投后台研发相关的岗位。 -于是开始收集各种学习资料,也买了很多纸质书。最开始的学习效率并不是很高,很迷茫,觉得要学的内容很多无从下手。那时候看别人的面经,感觉自己太弱了,很多内容都没接触过,于是更加迷茫。迷茫的时候总想着逃避,要是不复习多好,玩玩游戏每天多简单。但是游戏玩的越多,那种焦虑感越是强烈。解决焦虑的唯一办法就是想办法解决当前问题。当我慢慢地从消极的学习态度中调整过来,掌握的知识越多,那种焦虑感也随之消失。当然这个过程并不容易,不仅需要很好的毅力,也要根据自身情况找到问题的有效解决方法。 +于是开始收集各种学习资料,也买了很多纸质书。最开始的学习效率并不是很高,很迷茫,觉得要学的内容很多无从下手。那时候看别人的面经,感觉自己太弱了,很多内容都没接触过,于是更加迷茫。迷茫的时候总想着逃避,要是不复习多好,玩玩游戏每天多简单。但是游戏玩的越多,那种焦虑感越是强烈。解决焦虑的唯一办法就是想办法解决当前问题。当慢慢地从消极的学习态度中调整过来,掌握的知识越多,那种焦虑感也随之消失。当然这个过程并不容易,不仅需要很好的毅力,也要根据自身情况找到问题的有效解决方法。 ## 春招开始 -三月份各个公司就开始春招了,那时候刚把一些基础知识简单地复习了一下,Leetcode 刷到了三四百题。但是后台研发相关的项目没有,因此就花了一个星期左右用 PHP 做了一个微博系统。当时做简历特别痛苦,没内容可以写,看着其他人简历各种新技术,自己都没掌握,所以很虚。 +三月份各个公司就开始春招了,那时候刚把一些基础知识简单地复习了一下,Leetcode 刷到了三四百题。但是没有后台研发相关的项目,于是花了一个星期左右用 PHP 做了一个微博系统。当时做简历特别痛苦,没内容可以写,看着其他人简历各种新技术,自己都没掌握,所以很虚。 ## 阿里一轮游 -最开始投的阿里,实验室大几届有个师兄在天猫精灵团队,所以给我内推了。于是我人生中第一场面试就是阿里,很自然地被虐了一遍。记得当时约好下午两点电话面试,午饭都没吃,怕吃完之后犯困影响状态,然后找了一个很安静又没人的地方呆到了两点,调整自己的状态。可是面试官突然打电话说有个会议要开,所以推迟了大概一个小时。苦苦等到三点左右,面试正式开始,不出所料面得非常糟糕。首先自己表述的很有问题,很多内容没回答到关键点上,而且自己会的内容也不怎么继续扩展回答。其次知识掌握得确实不够,连线程安全、ThreadLocal、函数式编程都不会。虽然被虐的很惨,但是也有好处,知道了面试到底是怎样的,自己还有哪方面的不足,该怎么准备。 +最开始投的阿里,实验室大几届有个师兄在天猫精灵团队,所以给我内推了。于是我人生中第一场面试就是阿里,很自然地被虐了一遍。记得当时约好下午两点电话面试,午饭都没吃,怕吃完之后犯困影响状态,然后找了一个很安静又没人的地方呆到了两点,调整自己的状态。可是面试官突然打电话来说有个会议要开,所以推迟了大概一个小时。苦苦等到三点左右,面试正式开始,不出所料面得非常糟糕。首先自己表述的很有问题,很多内容没回答到关键点上,自己会的内容也不怎么继续扩展回答。其次知识掌握得确实不够,连线程安全、ThreadLocal、函数式编程都不会。虽然被虐的很惨,但是也有好处,知道了面试到底是怎样的,自己还有哪方面的不足,该怎么准备。 ## 腾讯被鞭尸 -第二场面试是腾讯,在经历了阿里的面试之后,并且又继续复习了一段时间,我对面试就比较有信心了。一面其实回答的挺理想的,虽然很多问题没有立马回答出来,但是经过面试官的耐心提示之后都能回答一些内容。当时面了一个半小时,面试体验特别好。印象比较深刻的题目有,阅读一个 Redis 源码,分析有哪些问题。其实就是一个计数器实现的限流算法,会有临界值的问题,但是当时没回答出来,只能听面试官给我解释。还有一个微信扫二维码,这个过程发生了什么,也没回答得很好,不过面试官也很耐心地纠正我回答上的错误。一面顺利通过了,但是总监面挂了。总监面没有问什么技术问题,就是问了问项目,然后自己的职业规划之类的。自己的项目确实比较 Low,我自己在介绍的时候也说得很不堪。职业规划我说自己希望在一些方面深入学习,因为自己现在在这些方面还很薄弱... 面完之后我就知道挂了,因为整个面试我都特别虚,还主动说自己技术能力不行。不出所料,面完的当天晚上,状态变成了不合适。 +第二场面试是腾讯,在经历了阿里的面试之后,并且又继续复习了一段时间,我对面试就比较有信心了。一面其实回答的挺理想的,虽然很多问题没有立马回答出来,但是经过面试官的耐心提示之后都能回答一些内容。当时面了一个半小时,面试体验特别好。印象比较深刻的题目有,阅读一个 Redis 源码,分析存在哪些问题。其实就是一个计数器实现的限流算法,会有临界值的问题,但是当时没回答出来,只能听面试官给我解释。还有一个微信扫二维码,这个过程发生了什么,也没回答得很好,不过面试官也很耐心地纠正我回答上的错误。一面顺利通过了,但是总监面挂了。总监面没有问什么技术问题,就是问了问项目和职业规划。自己的项目确实比较 Low,我自己在介绍的时候也说得很不堪。职业规划我说自己希望在一些方面深入学习,因为自己现在在这些方面还很薄弱... 面完之后我就知道挂了,因为整个面试过程我都特别虚,还主动说自己技术能力不行。不出所料,面完的当天晚上,状态变成了不合适。 -但是过了几天,突然收到腾讯的电话,问我是否愿意去深圳参加面试(笔者学校在广州)。当然我毫不犹豫地答应了,很开心腾讯还能给我机会。经过了上一场面试的启示,这次面试我表现地非常自信,自己知道的知识都很有自信地表达出来,被问到不会的内容也不会那么慌张,和面试官探讨一些细节,然后说说自己的想法,还有自己看过相关的内容。由于这是腾讯云部门,对 Linux 内核和 C++ 有很高的要求,问了几个相关的问题我都没回答出来,比如如何实现守护进程,Linux 信号机制,Linux 线程的不可中断阻塞状态如何进入等等。除了这些问题,其它地回答的都还行。遗憾的是,当天晚上面试官打电话告知我面试没通过。但是他说我其它方面都很不错,所以问我愿不愿意参加腾讯云 Java 部门的招聘,于是第二天我又去了一个新的部门面试。 +但是过了几天,突然收到腾讯的电话,问我是否愿意去深圳参加面试(笔者学校在广州)。当然我毫不犹豫地答应了,很开心腾讯还能给我机会。经过了上一场面试的启示,这次面试我表现地非常自信,自己知道的知识都很有信心地表达出来,被问到不会的内容也不会那么慌张,和面试官探讨一些细节,然后说说自己的想法,还有自己看过相关的内容。由于这是腾讯云部门,对 Linux 内核和 C++ 有很高的要求,问了几个相关的问题我都没回答出来,比如如何实现守护进程,Linux 信号机制,Linux 线程的不可中断阻塞状态如何进入等等。除了这些问题,其它地回答的都还行。遗憾的是,当天晚上面试官打电话告知我面试没通过。但是他说我其它方面都很不错,所以问我愿不愿意参加腾讯云 Java 部门的招聘,于是第二天我又去了一个新的部门面试。 -这次面试是在部门的会议室进行的,进到公司之后说实话没有自己想象中那么好,工位很挤环境一般。一开始就先随便聊聊,学校的研究工作,学习之类的。然后看了看项目,看完之后我就知道凉了一半,这个项目确实太水了,面试官看了之后没有接着问,也能感受到面试官有点嫌弃。然后他就问了一些基础知识,问到进程调度算法,面试官让我实现一个任务调度系统。因为是第一次手写代码,而且之前确实没考虑过这个问题,然后就胡乱写了一堆代码,特别乱,而且到处涂改。显然面试官是不满意的,写了也有十几分钟之后,我自己都知道已经凉了,然后面试官没让我接着写,也没给我任何提示,说就到这里,面试结束了,还有没有什么问题想问的。当然看过任务调度系统相关的文章会觉得挺容易的,比如使用时间轮实现等等。我依然记得面试官送我出门时候的热情,送我到电梯的时候还很热情地和我说,非常感谢参加本次面试,辛苦了。 +这次面试是在部门的会议室进行的,进到公司之后说实话没有自己想象中那么好,工位很挤环境一般。一开始就先随便聊聊,学校的研究工作,学习之类的。然后看了看项目,看完之后我就知道凉了一半,这个项目确实太水了,面试官看了之后没有接着问,也能感受到面试官有点嫌弃。然后他就问了一些基础知识,问到进程调度算法,面试官让我实现一个任务调度系统。因为是第一次手写代码,而且之前确实没考虑过这个问题,然后就胡乱写了一堆代码,特别乱,而且到处涂改。显然面试官是不满意的,写了也有十几分钟之后,我自己都知道已经凉了,然后面试官没让我接着写,也没给我任何提示,说就到这里,面试结束了,还有没有什么问题想问的。当然看过任务调度系统相关的文章会觉得挺容易的,比如使用时间轮实现等等。我依然记得面试官送我出门时候的热情,送我坐电梯的时候还很热情地和我说,非常感谢参加本次面试,辛苦了。 ## 虎牙过于自信 @@ -64,29 +64,43 @@ 其实最理想的是去百度实习,秋招也会容易很多。但是考虑到百度是在北京,部门很边缘,而且需要实习很长时间也不一定能转正,所以还是放弃了。最后只能在网易游戏和微众选,虽然自己不想做游戏,但是考虑到网易游戏的平台认可程度比微众好,秋招肯定会更容易一些。而且秋招如果还想进微众的话也会比较容易,因为面试官和 HR 都说秋招的时候会优先考虑我,所以最后还是去了网易游戏实习。 +## 实习之前的快速学习期 + +经历了春招之后,认识到了自己身上的不足,比如交流表达能力的欠缺,知识积累得不够,项目深度不够。因此在实习之前的两三个月,开始针对这些问题逐个解决。 + +* 交流表达能力欠缺,就提前准备好各种非技术问题,然后对着镜子回答,把自己当成听众,并且也用录音机录下来。 +* 知识积累不够,采取的策略是保证广度优先,并且在重要的内容上保证深度。其实之前基础知识已经掌握的比较好了,再学其它技术的时候都有很多相同的地方,所以学起来很快。 +* 项目深度不够,就把那个微博系统做了一点改进,学了 Spring 之后改用 Java 实现。 + ## 不那么安心的实习 -去实习的时候还是挺惊喜的,因为我被安排的工作是游戏引擎相关的,和自己的研究生方向紧密相关,所以我觉得做完实习项目之后自己的毕业论文也会比较有灵感。但不幸的是,在去的第一天部门接待聚餐上,服务端主程就说,我们部门工作制是九九六,现在互联网都是九九六。在实习之前我了解的是实习生六点就可以走,而且只用上五天班,听到他这么一说心都凉透了,因为已经想好了晚上和周末要拿来复习。如果知道是九九六,我会选择去百度。 +去实习的时候还是挺惊喜的,因为我被安排的工作是游戏引擎相关的,和自己的研究生方向紧密相关,我觉得做完实习项目之后自己的毕业论文也会比较有灵感。 -其实网易游戏部门氛围还是不错的,对员工很好,而且我的实习导师人也很好,在我生病的那几天很关心我。但是九九六的工作时长对秋招复习还是有很大影响的,而且每天去公司花在路上的时间超过了两个小时,下班回寝室之后总想着看会儿视频休息一下,然后又要早早睡觉赶着第二天上班。没办法只能在上下班地铁上复习,还有就是午休时间接着复习。 +但不幸的是,在去的第一天部门接待聚餐上,服务端主程就说,我们部门工作制是九九六,现在互联网都是九九六。在实习之前我了解的是实习生六点就可以走,而且只用上五天班,听到他这么一说心都凉透了,因为已经想好了晚上和周末时间用来复习。如果知道是九九六,我会选择去百度。 + +其实网易游戏部门氛围还是不错的,对员工很好,而且我的实习导师人也很好,在我生病的那几天很关心我。但是九九六的工作制对秋招复习还是有很大影响的,而且每天上下班花在路上的时间超过了两个小时,下班回寝室之后总想着看会儿视频休息一下,然后又要早早睡觉赶着第二天上班。没办法只能在上下班地铁上复习,还有就是午休时间接着复习。 + +## 秋招开始 实习之后已经是九月份了,那时候已经错过了所有提前批。而且实习的时候没怎么复习,九月初还是感觉没怎么准备充分,所以就又等了半个月才开始投简历。 +但是这个时候和秋招相比,已经把大部分后台研发相关的知识点过了一遍,很多重要的内容前前后后也看了十几遍,没有春招时候那么迷茫和焦虑。即使被问到没有掌握的知识,我也有把握通过讨论的方式,给出大概的思路,因为很多技术确实是相通的。 + ## 阿里搞不懂的内部流程 -秋招第一个投递的依然是阿里,最开始系统自动发起了一个新的流程,然后过了几天自动回绝了... 八月末的时候也找人内推了,但是又被阿里直接回绝了... 那时候已经觉得可能是春招面试表现太差,此生无缘阿里了。可是过了一段时间,正式校招的时候,阿里又发起了一个新的流程戏弄我,收到笔试通知的时候,我还犹豫了到底参不参加,因为那时候已经九月中旬,听说阿里已经没有 HC 了。而且按前面回绝我的态度,感觉即使笔试通过面试也通过不了。笔试那天晚上,本来准备找个电影放松一下,后来想了想还是参加了笔试,笔试各种机器学习和数学题,感觉拿错了试卷,笔试完我已经把阿里从我的公司进度列表中删除了,不再纠结阿里。可是过了一段时间又收到阿里的面试通知,我以为是走走形式,可能参加笔试的人很少了,所以才选中我参加面试。那时候阿里招聘官网状态一排的已回绝,让我对阿里有一种恐惧感,觉得面试肯定挂。但是真正面试的时候意外的顺利,收到二面通知的时候特别激动,然后面完二面又让直接等 HR 面,HR 面虽然不是很理想,但是没有很大的问题。又过了很长一段时间,在我去深圳参加腾讯招聘的高铁上,收到了高德地图 HR 的电话,问是否愿意去。虽然得知部门在北京有点小失落,但是还是很开心终于被阿里认可了,摆脱了对阿里的恐惧。 +秋招第一个投递的依然是阿里,最开始系统自动发起了一个新的流程,然后过了几天自动回绝了... 八月末的时候也找人内推了,但是又被阿里直接回绝了... 那时候已经觉得可能是春招面试表现太差,此生无缘阿里了。可是过了一段时间,正式校招的时候,阿里又发起了一个新的流程戏弄我,收到笔试通知的时候,我还犹豫了到底参不参加,因为那时候已经九月中旬,听说阿里已经没有 HC 了。而且按前面回绝我的态度,感觉即使笔试通过面试也通过不了。笔试那天晚上,本来准备看个电影放松一下,后来想了想还是参加了笔试,笔试各种机器学习和数学题,感觉拿错了试卷,笔试完我已经把阿里从我的公司进度列表中删除了,不再纠结阿里。可是过了一段时间收到阿里的面试通知,我以为是走走形式,可能参加笔试的人很少了,所以才选中我参加面试。那时候阿里招聘官网状态一排的已回绝,让我对阿里有一种恐惧感,觉得面试肯定挂。但是真正面试的时候却意外的顺利,收到二面通知的时候特别激动,然后面完二面又让直接等 HR 面,HR 面虽然不是很理想,但是没有很大的问题。又过了很长一段时间,在我去深圳参加腾讯招聘的高铁上,收到了高德地图 HR 的电话,问是否愿意去。虽然得知部门在北京有点小失落,但是还是很开心终于被阿里认可了,摆脱了对阿里的恐惧。 -实验室上届毕业在阿里云的大佬某天突然和我说,他们部门有新的 HC,让我把简历发给他,他要帮我内推,会帮我安排一场线下面试,如果通过的话,到时候和高德的 HR 沟通一下,直接把我从高德捞过来。很感谢大佬向他老大极力推荐我,给我了这次面试机会。线下面试也很顺利,聊聊实习项目,问问我的开源博客,然后问些 Paxos 等分布式的问题,还有就是手写代码,信号量实现生产者消费者,以及一个位运算的问题。其实位运算的问题面试的时候写的不完善,面试官让我之后完善了再发给他,因为面试一个多小时有点长了。过后我写了详细文档讲解了思路,以及用 JUnit 进行了详细的单元测试,把文档和代码都发给了他。现在面试已经通过了,但是最近阿里集团 HC 比较紧张,也不知道能不能批到 HC。 +实验室上届毕业在阿里云的大佬某天突然和我说,他们部门有新的 HC,让我把简历发给他,他要帮我内推,会帮我安排一场线下面试,如果通过的话,到时候和高德的 HR 沟通一下,直接把我从高德捞过来。很感谢大佬向他老大极力推荐我,给我了这次面试机会。线下面试也很顺利,聊聊实习项目,问问我的开源博客,然后问些 Paxos 等分布式的问题,还有就是手写代码,信号量实现生产者消费者,以及一个位运算的问题。其实位运算的问题面试的时候写的不完善,面试官让我之后完善了再发给他,因为面试一个多小时有点长了。过后我写了详细文档讲解了思路,以及使用 JUnit 进行了详细的单元测试,把文档和代码都发给了他。现在面试已经通过了,但是最近阿里集团 HC 比较紧张,也不知道能不能批到 HC。 ## 百度又是不那么让人满意的部门 -虽然阿里是最先开始流程,但是第一个参加面试的是百度。因为实习的时候通过了百度的面试,所以这次面试还是比较有信心的。百度面试连续三天,都在同一个地方,最后签约也在同一个地方,还记得每次都坐一个小时左右的地铁去那里,路线已经非常熟悉了,和每天去实习的感觉类似。百度面试比较注重技术,三轮面试基本都是问技术问题,而且问的也比较深入,内容也非常广。但是面的不是那么理想,有两点原因,首先是因为确实有些知识点还没掌握好,比如 AC 自动机,系统故障分析等等;其次是对实习项目的描述上还不够好,没有把实习内容的闪光点描述出来,也没有讲清楚为什么做这个项目,自己通过什么方法去做,以及最后的结果。 +虽然阿里是最先开始流程,但是第一个参加面试的是百度。因为实习的时候通过了百度的面试,所以这次面试还是比较有信心的。百度面试连续三天,都在同一个地方,最后签约也在同一个地方。还记得每次都坐一个小时左右的地铁去那里,路线已经非常熟悉了,和每天去实习的感觉类似。百度面试比较注重技术,三轮面试基本都是问技术问题,而且问的也比较深入,内容也非常广。但是面的不是那么理想,有两点原因,首先是因为确实有些知识点还没掌握好,比如 AC 自动机,系统故障分析等等;其次是对实习项目的描述上还不够好,没有把实习内容的闪光点描述出来,也没有讲清楚为什么做这个项目,自己通过什么方法去做,以及最后的结果。 最后百度给了白菜价,部门是企业智能平台,主要是内部系统,虽然会接触到机器学习和大数据。 ## 腾讯虐我千百遍 -秋招腾讯第一场面试和实习参加腾讯面试的感觉非常像,第一轮技术面感觉很好,手写堆排序算法,二部图分析等等。面完之后通知待会儿二面,听到之后还是很激动的,觉得这次应该没问题了。我在等二面的时候,碰到了室友(他经常不住宿舍,所以不清楚他也去面试),聊着聊着居然发现我两是同一个面试官,而且他是来二面的,也就是等一下我两就要一前一后进去面试。二面的感觉和实习二面非常像,非技术问题回答的支支吾吾,然后面试官开始质疑我说的内容,给我压力,我没有当场反驳,就说了哦,好像是这样的。因为面试官全程都绷着脸,所以我也比较紧张,很多问题没回答好。面完之后我也意识到了这个问题,然后开始练习自己回答那些非技术面试问题的表达能力,经常在镜子前面对一个问题进行回答。过了几天,室友和我说收到 HR 面试通知了,我去官网看了一下状态,已经变成了熟悉的不合适。 +秋招腾讯第一场面试和实习参加腾讯面试的感觉非常像,第一轮技术面感觉很好,手写堆排序算法,二部图分析等等。面完之后通知待会儿二面,听到之后还是很激动的,觉得这次应该没问题了。我在等二面的时候,碰到了室友(他经常不住宿舍,所以不清楚他也去面试),聊着聊着居然发现我两是同一个面试官,而且他是来二面的,也就是等一下我两就要一前一后进去面试。二面的感觉和实习二面非常像,非技术问题回答的支支吾吾,然后面试官开始质疑我说的内容,给我压力,我没有当场反驳,就说了哦,好像是这样的。因为面试官全程都绷着脸,所以我也比较紧张,很多问题没回答好。面完之后我也意识到了这个问题,然后开始练习自己回答那些非技术面试问题的表达能力,经常在镜子前面对面试中问到的问题进行回答。过了几天,室友和我说收到 HR 面试通知了,我去官网看了一下状态,已经变成了熟悉的不合适。 因为实习有被捞起来的经历,所以被拒之后我特别希望能继续被捞起来,然后把简历上的面试城市改成了深圳。苦苦等到深圳场面试的前几天,在不经意的一个下午手机突然响了,我记得是短信邮件同时收到面试通知。于是又开始了新一轮被腾讯虐的面试之旅。 @@ -94,7 +108,7 @@ ## 头条意外的惊喜 -之前看到学弟收到头条的 Offer,薪资非常诱人,所以也想去试试。也听说头条面试难度非常大,主要考察手写算法,因为自己算法方面准备得比较充分,所以觉得会比较顺利,但是也没有特别高的预期。前两面中规中矩,算法题和其它问题我都回答的比较好,到三面的时候,问了一个错排问题,其实最开始我给了正确的递推公式,但不是面试官想要的答案,所以让我再想想。我想了十几分钟还是觉得没问题,那时候觉得自己已经凉了,因为面试官一直不满意。后面的几个问题也没回答的很好,分析一个 SQL 语句的具体执行过程,比如会怎么利用索引,怎么优化之类的,虽然在他的提示下还是回答了,但是感觉并不好。面完之后我立马查了一下那个错排问题,证实了我的答案是正确的,于是写了一个详细的文档,联系 HR 让她发给面试官。出乎意料的是,HR 让我不用担心,他说面试官对我的评价很好... 不过最后还是让她把文档发给了面试官。之后收到了加面通知,头条加面有两种情况,一是三轮评级都是 4 可以评 SSP,二是面试官评价差别很大,再面一轮决定是否录用。收到加面的时候完全不知道自己属于哪一种,感觉两种情况都有可能。加面回答的也不好,主要是问项目,面了 25 分钟就草草结束,后最后面试官说有些内容需要找一些文献参考参考。面完之我觉得,即使我属于第一种要评 SSP 的情况,加面面的那么差应该也没希望了。苦苦等了好多天之后,最后确定是 SSP 之后,还是很惊喜的,感觉是对自己这么长时间复习的一个认可。 +之前看到学弟收到头条的 Offer,薪资非常诱人,所以也想去试试。也听说头条面试难度非常大,主要考察手写算法,因为自己算法方面准备得比较充分,所以觉得会比较顺利,但是也没有特别高的预期。前两面中规中矩,算法题和其它问题我都回答的比较好,到三面的时候,问了一个错排问题,其实最开始我给了正确的递推公式,但不是面试官想要的答案,所以让我再想想。我想了十几分钟还是觉得没问题,那时候觉得自己已经凉了,因为面试官一直不满意。后面的几个问题也没回答的很好,分析一个 SQL 语句的具体执行过程,比如会怎么利用索引,怎么优化之类的,虽然在他的提示下还是回答了,但是感觉并不好。面完之后我立马查了一下那个错排问题,证实了我的答案是正确的,于是写了一个详细的文档,联系 HR 让她发给面试官。出乎意料的是,HR 让我不用担心,他说面试官对我的评价很好... 不过最后还是让她把文档发给了面试官。之后收到了加面通知,头条加面有两种情况,一是三轮评级都是 4 可以评 SSP,二是面试官评价差别很大,再面一轮决定是否录用。收到加面的时候完全不知道自己属于哪一种,感觉两种情况都有可能。加面回答的也不好,主要是问项目,面了 25 分钟就草草结束,最后面试官说有些内容需要找一些文献参考参考。面完之后我觉得,即使我属于第一种要评 SSP 的情况,加面面的那么差应该也没希望了。苦苦等了好多天之后,最后确定是 SSP 之后,还是很惊喜的,感觉是对自己这么长时间复习的一个认可。 ## 顺丰最后的保底 @@ -104,6 +118,10 @@ 去华为面试确实是没有压力的,因为都知道华为面试不怎么问技术,虽然还是问了我一些技术问题,不过不是问的很深。面试主要介绍项目,我对自己的实习项目还是比较有信心的,因为觉得做的确实不错,而且面了很多场了,知道该怎么介绍项目。面试官问我个人意愿,我说自己对分布式中间件等比较感兴趣,于是面试官把我推荐到了 Cloud Bu。本来没打算签华为的,现场签约也就去看看到底给我开多少。最开始其实给我开了十四级最高的薪资,我本来不是很想去,虽然对这个部门感兴趣,但是薪资确实比不上头条。然后随口问了一句可不可以给十五级,HR 居然很爽快地说可以,但是只在绩效加 1k... 我都怕了,要是真给十五级确实很有吸引力,股票分红之类的,而且华为也在大力发展这个部门,所以突然就很纠结了。当然升一级需要部门讨论之后才能确定,但是我后面说了我有很多 Offer 可以选择,她也对我这些 Offer 很满意,大概率能评上,但是薪资涨得不多。 +## 技术博客 + +最后安利一下自己的技术博客:[CS-Notes](https://github.com/CyC2018/CS-Notes),虽然现在还有很多不完善的地方,但以后会不断改进。 + ## 小结 很多人都说,面试和考试一样,要背很多没用的东西。最开始我也认同这种看法,可是参加了几场面试之后,我就不这么认为了。因为面试出的问题,有很多是实际开发中碰到的,所以准备面试相当于提前做入职准备。而且面试中考察的思维能力、交流表达能力、应对压力能力,都是真正工作中所需要的。 @@ -112,4 +130,4 @@ 信心源自于充分准备,有了信心,面试的时候才能游刃有余。而毫无依据的自我良好,在每次失败之后都看不到自身的不足,而是怪外界的因素。 -做好自己的简历,我在简历上花了很长时间,只要允许,我都会用这个简历给面试官演示:[个人简历](https://cyc2018.github.io) \ No newline at end of file +做好自己的简历,我在简历上花了很长时间,只要允许,我都会用这个简历给面试官演示:[个人简历](https://cyc2018.github.io)。 \ No newline at end of file From ef0180f706e5f184d3ae28de2818c72516eaec24 Mon Sep 17 00:00:00 2001 From: CyC2018 <1029579233@qq.com> Date: Tue, 30 Oct 2018 17:50:41 +0800 Subject: [PATCH 08/55] auto commit --- notes/Java 并发.md | 2 +- notes/设计模式.md | 2 +- notes/重构.md | 2 +- pics/77931a4b-72ba-4016-827d-84b9a6845a51.png | Bin 0 -> 30720 bytes 4 files changed, 3 insertions(+), 3 deletions(-) create mode 100644 pics/77931a4b-72ba-4016-827d-84b9a6845a51.png diff --git a/notes/Java 并发.md b/notes/Java 并发.md index 8b26ae91..cc2c28a9 100644 --- a/notes/Java 并发.md +++ b/notes/Java 并发.md @@ -766,7 +766,7 @@ run..run..run..run..run..run..run..run..run..run..end 用来控制多个线程互相等待,只有当多个线程都到达时,这些线程才会继续执行。 -和 CountdownLatch 相似,都是通过维护计数器来实现的。线程执行 await() 方法之后计数器会减 1,并进行等待,直到计数器为 0,所有调用 awati() 方法而在等待的线程才能继续执行。 +和 CountdownLatch 相似,都是通过维护计数器来实现的。线程执行 await() 方法之后计数器会减 1,并进行等待,直到计数器为 0,所有调用 await() 方法而在等待的线程才能继续执行。 CyclicBarrier 和 CountdownLatch 的一个区别是,CyclicBarrier 的计数器通过调用 reset() 方法可以循环使用,所以它才叫做循环屏障。 diff --git a/notes/设计模式.md b/notes/设计模式.md index 6d779e2f..38713e5f 100644 --- a/notes/设计模式.md +++ b/notes/设计模式.md @@ -2578,7 +2578,7 @@ public class Client { 组合对象拥有一个或者多个组件对象,因此组合对象的操作可以委托给组件对象去处理,而组件对象可以是另一个组合对象或者叶子对象。 -

+

### Implementation diff --git a/notes/重构.md b/notes/重构.md index d7e31bf8..e90fa84e 100644 --- a/notes/重构.md +++ b/notes/重构.md @@ -383,7 +383,7 @@ class App { ## 重构与性能 -为了使代码更容易理解,重构可能会导致性能减低。 +为了软代码更容易理解,重构可能会导致性能减低。 在编写代码时,不用对性能过多关注,只有在最后性能优化阶段再考虑性能问题。 diff --git a/pics/77931a4b-72ba-4016-827d-84b9a6845a51.png b/pics/77931a4b-72ba-4016-827d-84b9a6845a51.png new file mode 100644 index 0000000000000000000000000000000000000000..6f8a3c52df2320efdd20161e1918f3a8eeefd8e8 GIT binary patch literal 30720 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 Date: Wed, 31 Oct 2018 00:42:29 +0800 Subject: [PATCH 09/55] =?UTF-8?q?Update=202018=20=E8=BF=99=E4=B8=80?= =?UTF-8?q?=E5=B9=B4.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 2018 这一年.md | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/2018 这一年.md b/2018 这一年.md index 1ede56eb..f1d3f132 100644 --- a/2018 这一年.md +++ b/2018 这一年.md @@ -42,7 +42,7 @@ ## 虎牙过于自信 -经过了阿里和腾讯的面试之后,我觉得自己大概已经知道该怎么面试了,面试时候该注意什么,该怎么表达等等。而且腾讯面试表现也不差,虽然最后没通过。所以在虎牙面试的时候特别放松,觉得应该能通过。前面面的也都还行,虽然有几个问题没回答好,比如分析一下微博的时间线。通过了第一轮面试直接等第二轮,等到了晚上七点多才等到我。虎牙面试还是很注重技术的,虽然问的都不是很深入,只要简单回答到点上就不会接着问下去。二面也有一些问题没回答好,比如 ConcurrentHashMap 的并发机制,问 Spring 直接说不会。也有一些问题回答得比较乱,没有条理。但是我觉得大部分问题都回答的不错,应该能通过。可是面试完之后,面试官问有没有什么问题要问他,由于太过放松,我就问你们都加班到这么晚不吃饭吗,好饿啊,周六周日还加班吗... 问完之后面试官就很严肃了,说平常不加班的,然后我突然意识到问题的严重性... 最后还是凉了。 +经过了阿里和腾讯的面试之后,我觉得自己大概已经知道该怎么面试了,面试时候该注意什么,该怎么表达等等。而且腾讯面试表现也不差,虽然最后没通过。所以在虎牙面试的时候特别放松,觉得应该能通过。前面面的也都还行,虽然有几个问题没回答好,比如分析一下微博的时间线。通过了第一轮面试直接等第二轮,等到了晚上七点多才等到我。虎牙面试还是很注重技术的,虽然问的都不是很深入,只要简单回答到点上就不会接着问下去。二面也有一些问题没回答好,比如 ConcurrentHashMap 的并发机制,问 Spring 直接说不会。也有一些问题回答得比较乱,没有条理。但是我觉得大部分问题都回答的不错,应该能通过。可是面试完之后,面试官问有没有什么问题要问他,由于太过放松,我就问你们都加班到这么晚不吃饭吗,好饿啊,周六周日还加班吗... 问完之后面试官就很严肃了,说平常不加班的,我突然意识到了问题的严重性... 最后还是凉了。 ## 百度第一个 Offer @@ -84,15 +84,15 @@ 实习之后已经是九月份了,那时候已经错过了所有提前批。而且实习的时候没怎么复习,九月初还是感觉没怎么准备充分,所以就又等了半个月才开始投简历。 -但是这个时候和秋招相比,已经把大部分后台研发相关的知识点过了一遍,很多重要的内容前前后后也看了十几遍,没有春招时候那么迷茫和焦虑。即使被问到没有掌握的知识,我也有把握通过讨论的方式,给出大概的思路,因为很多技术确实是相通的。 +但是这个时候和春招相比,已经把大部分后台研发相关的知识点过了一遍,很多重要的内容前前后后也看了十几遍,没有春招时候那么迷茫和焦虑。即使被问到没有掌握的知识,我也有把握通过讨论的方式,给出大概的思路,因为很多技术确实是相通的。 -## 阿里搞不懂的内部流程 +## 阿里看不懂的内部流程 秋招第一个投递的依然是阿里,最开始系统自动发起了一个新的流程,然后过了几天自动回绝了... 八月末的时候也找人内推了,但是又被阿里直接回绝了... 那时候已经觉得可能是春招面试表现太差,此生无缘阿里了。可是过了一段时间,正式校招的时候,阿里又发起了一个新的流程戏弄我,收到笔试通知的时候,我还犹豫了到底参不参加,因为那时候已经九月中旬,听说阿里已经没有 HC 了。而且按前面回绝我的态度,感觉即使笔试通过面试也通过不了。笔试那天晚上,本来准备看个电影放松一下,后来想了想还是参加了笔试,笔试各种机器学习和数学题,感觉拿错了试卷,笔试完我已经把阿里从我的公司进度列表中删除了,不再纠结阿里。可是过了一段时间收到阿里的面试通知,我以为是走走形式,可能参加笔试的人很少了,所以才选中我参加面试。那时候阿里招聘官网状态一排的已回绝,让我对阿里有一种恐惧感,觉得面试肯定挂。但是真正面试的时候却意外的顺利,收到二面通知的时候特别激动,然后面完二面又让直接等 HR 面,HR 面虽然不是很理想,但是没有很大的问题。又过了很长一段时间,在我去深圳参加腾讯招聘的高铁上,收到了高德地图 HR 的电话,问是否愿意去。虽然得知部门在北京有点小失落,但是还是很开心终于被阿里认可了,摆脱了对阿里的恐惧。 实验室上届毕业在阿里云的大佬某天突然和我说,他们部门有新的 HC,让我把简历发给他,他要帮我内推,会帮我安排一场线下面试,如果通过的话,到时候和高德的 HR 沟通一下,直接把我从高德捞过来。很感谢大佬向他老大极力推荐我,给我了这次面试机会。线下面试也很顺利,聊聊实习项目,问问我的开源博客,然后问些 Paxos 等分布式的问题,还有就是手写代码,信号量实现生产者消费者,以及一个位运算的问题。其实位运算的问题面试的时候写的不完善,面试官让我之后完善了再发给他,因为面试一个多小时有点长了。过后我写了详细文档讲解了思路,以及使用 JUnit 进行了详细的单元测试,把文档和代码都发给了他。现在面试已经通过了,但是最近阿里集团 HC 比较紧张,也不知道能不能批到 HC。 -## 百度又是不那么让人满意的部门 +## 百度又是不那么满意的部门 虽然阿里是最先开始流程,但是第一个参加面试的是百度。因为实习的时候通过了百度的面试,所以这次面试还是比较有信心的。百度面试连续三天,都在同一个地方,最后签约也在同一个地方。还记得每次都坐一个小时左右的地铁去那里,路线已经非常熟悉了,和每天去实习的感觉类似。百度面试比较注重技术,三轮面试基本都是问技术问题,而且问的也比较深入,内容也非常广。但是面的不是那么理想,有两点原因,首先是因为确实有些知识点还没掌握好,比如 AC 自动机,系统故障分析等等;其次是对实习项目的描述上还不够好,没有把实习内容的闪光点描述出来,也没有讲清楚为什么做这个项目,自己通过什么方法去做,以及最后的结果。 @@ -100,7 +100,7 @@ ## 腾讯虐我千百遍 -秋招腾讯第一场面试和实习参加腾讯面试的感觉非常像,第一轮技术面感觉很好,手写堆排序算法,二部图分析等等。面完之后通知待会儿二面,听到之后还是很激动的,觉得这次应该没问题了。我在等二面的时候,碰到了室友(他经常不住宿舍,所以不清楚他也去面试),聊着聊着居然发现我两是同一个面试官,而且他是来二面的,也就是等一下我两就要一前一后进去面试。二面的感觉和实习二面非常像,非技术问题回答的支支吾吾,然后面试官开始质疑我说的内容,给我压力,我没有当场反驳,就说了哦,好像是这样的。因为面试官全程都绷着脸,所以我也比较紧张,很多问题没回答好。面完之后我也意识到了这个问题,然后开始练习自己回答那些非技术面试问题的表达能力,经常在镜子前面对面试中问到的问题进行回答。过了几天,室友和我说收到 HR 面试通知了,我去官网看了一下状态,已经变成了熟悉的不合适。 +秋招腾讯第一场面试和实习参加腾讯面试的感觉非常像,第一轮技术面感觉很好,手写堆排序算法,二部图分析等等。面完之后通知待会儿二面,听到之后还是很激动的,觉得这次应该没问题了。我在等二面的时候,碰到了室友(他经常不住宿舍,所以不清楚他也去面试),聊着聊着居然发现我两是同一个面试官,而且他是来二面的,也就是等一下我两就要一前一后进去面试。二面的感觉和实习二面非常像,非技术问题回答的支支吾吾,然后面试官开始质疑我说的内容,给我压力,我没有当场反驳,就说了哦,好像是这样的。因为面试官全程都绷着脸,所以我也比较紧张,很多问题没回答好。过了几天,室友和我说收到 HR 面试通知了,我去官网看了一下状态,已经变成了熟悉的不合适。这次面试失败的主要原因是自己在应对这种压力时处理地不是很好,主要体现在失去信心以及紧张。解决方法也简单,做好充分准备来保持信心,收到质疑的时候积极反驳,紧张的时候即使调整心态,可以试试深呼吸。 因为实习有被捞起来的经历,所以被拒之后我特别希望能继续被捞起来,然后把简历上的面试城市改成了深圳。苦苦等到深圳场面试的前几天,在不经意的一个下午手机突然响了,我记得是短信邮件同时收到面试通知。于是又开始了新一轮被腾讯虐的面试之旅。 @@ -116,7 +116,7 @@ ## 华为特别纠结的部门 -去华为面试确实是没有压力的,因为都知道华为面试不怎么问技术,虽然还是问了我一些技术问题,不过不是问的很深。面试主要介绍项目,我对自己的实习项目还是比较有信心的,因为觉得做的确实不错,而且面了很多场了,知道该怎么介绍项目。面试官问我个人意愿,我说自己对分布式中间件等比较感兴趣,于是面试官把我推荐到了 Cloud Bu。本来没打算签华为的,现场签约也就去看看到底给我开多少。最开始其实给我开了十四级最高的薪资,我本来不是很想去,虽然对这个部门感兴趣,但是薪资确实比不上头条。然后随口问了一句可不可以给十五级,HR 居然很爽快地说可以,但是只在绩效加 1k... 我都怕了,要是真给十五级确实很有吸引力,股票分红之类的,而且华为也在大力发展这个部门,所以突然就很纠结了。当然升一级需要部门讨论之后才能确定,但是我后面说了我有很多 Offer 可以选择,她也对我这些 Offer 很满意,大概率能评上,但是薪资涨得不多。 +去华为面试确实是没有压力的,因为都知道华为面试不怎么问技术,虽然还是问了我一些技术问题,不过不是问的很深。面试主要介绍项目,我对自己的实习项目还是比较有信心的,因为觉得做的确实不错,而且面了很多场了,知道该怎么介绍项目。面试官问我个人意愿,我说自己对分布式中间件等比较感兴趣,于是面试官把我推荐到了 Cloud Bu。本来没打算签华为的,现场签约也就去看看到底给我开多少。最开始其实给我开了十四级最高的薪资,我本来不是很想去,虽然对这个部门感兴趣,但是薪资确实比不上头条。然后随口问了一句可不可以给十五级,HR 居然说可以... 但是只在绩效加 1k,要是真给十五级确实很有吸引力,股票分红之类的。而且华为也在大力发展这个部门,所以突然就很纠结了。当然升一级需要部门讨论之后才能确定,但是我后面说了我有很多 Offer 可以选择,她也对我这些 Offer 很满意,大概率能评上,但是薪资涨得不多。 ## 技术博客 @@ -128,6 +128,6 @@ 我觉得自己比别人做的好的地方是,有很强烈的想找到好工作的意愿,才驱使我不断学习,所以态度很重要。 -信心源自于充分准备,有了信心,面试的时候才能游刃有余。而毫无依据的自我良好,在每次失败之后都看不到自身的不足,而是怪外界的因素。 +信心源自于充分准备,有了信心,面试的时候才能游刃有余。而毫无依据的自我感觉良好,在每次失败之后都看不到自身的不足,而是怪罪于外界因素。 做好自己的简历,我在简历上花了很长时间,只要允许,我都会用这个简历给面试官演示:[个人简历](https://cyc2018.github.io)。 \ No newline at end of file From ff758c6b34bc05e3db59e8f36dd391dc201a89e7 Mon Sep 17 00:00:00 2001 From: CyC2018 <1029579233@qq.com> Date: Thu, 1 Nov 2018 16:52:50 +0800 Subject: [PATCH 10/55] =?UTF-8?q?Update=202018=20=E8=BF=99=E4=B8=80?= =?UTF-8?q?=E5=B9=B4.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 2018 这一年.md | 133 ------------------------------------------------- 1 file changed, 133 deletions(-) delete mode 100644 2018 这一年.md diff --git a/2018 这一年.md b/2018 这一年.md deleted file mode 100644 index f1d3f132..00000000 --- a/2018 这一年.md +++ /dev/null @@ -1,133 +0,0 @@ -## 前言 - -2018,有过迷茫,有过努力,也有很多收获。为了记录这一年以来的感受,于是有了这篇文章。 - -## Offer 情况 - -经过了长达一年左右的复习,秋招也收到了几个比较满意的 Offer,参加面试的都通过了。 - -* 百度,企业智能平台; -* 阿里,高德地图,部门已联系,目前还在申报 Offer 中; -* 腾讯,IEG 游戏平台,后台研发,SP; -* 字节跳动,头条后台研发,SSP; -* 华为,Cloud Bu,十五级(未定); -* 网易游戏,梦幻事业部; -* 顺丰科技。 - -## 前期准备 - -也是在去年十一月份左右,看着身边两年制的同学经历了长时间而又艰难的秋招,我开始意识到自己应该提前准备了,否则自己的秋招会很惨。 - -本科的时候,虽然学过计算机网络、操作系统和数据结构等课程,而且 Leetcode 也刷了一两百题,但是离招聘要求还差的很远,学的都很浅只够应付考试,也没有实际的项目经验。 - -我的研究生方向是计算机图形学,研究生期间主要做一些科研项目。在选择招聘方向的时候,我也纠结了是不是找图形学相关方向的,但是考虑到图形学的选择不是很多,所以还是决定投后台研发相关的岗位。 - -于是开始收集各种学习资料,也买了很多纸质书。最开始的学习效率并不是很高,很迷茫,觉得要学的内容很多无从下手。那时候看别人的面经,感觉自己太弱了,很多内容都没接触过,于是更加迷茫。迷茫的时候总想着逃避,要是不复习多好,玩玩游戏每天多简单。但是游戏玩的越多,那种焦虑感越是强烈。解决焦虑的唯一办法就是想办法解决当前问题。当慢慢地从消极的学习态度中调整过来,掌握的知识越多,那种焦虑感也随之消失。当然这个过程并不容易,不仅需要很好的毅力,也要根据自身情况找到问题的有效解决方法。 - -## 春招开始 - -三月份各个公司就开始春招了,那时候刚把一些基础知识简单地复习了一下,Leetcode 刷到了三四百题。但是没有后台研发相关的项目,于是花了一个星期左右用 PHP 做了一个微博系统。当时做简历特别痛苦,没内容可以写,看着其他人简历各种新技术,自己都没掌握,所以很虚。 - -## 阿里一轮游 - -最开始投的阿里,实验室大几届有个师兄在天猫精灵团队,所以给我内推了。于是我人生中第一场面试就是阿里,很自然地被虐了一遍。记得当时约好下午两点电话面试,午饭都没吃,怕吃完之后犯困影响状态,然后找了一个很安静又没人的地方呆到了两点,调整自己的状态。可是面试官突然打电话来说有个会议要开,所以推迟了大概一个小时。苦苦等到三点左右,面试正式开始,不出所料面得非常糟糕。首先自己表述的很有问题,很多内容没回答到关键点上,自己会的内容也不怎么继续扩展回答。其次知识掌握得确实不够,连线程安全、ThreadLocal、函数式编程都不会。虽然被虐的很惨,但是也有好处,知道了面试到底是怎样的,自己还有哪方面的不足,该怎么准备。 - -## 腾讯被鞭尸 - -第二场面试是腾讯,在经历了阿里的面试之后,并且又继续复习了一段时间,我对面试就比较有信心了。一面其实回答的挺理想的,虽然很多问题没有立马回答出来,但是经过面试官的耐心提示之后都能回答一些内容。当时面了一个半小时,面试体验特别好。印象比较深刻的题目有,阅读一个 Redis 源码,分析存在哪些问题。其实就是一个计数器实现的限流算法,会有临界值的问题,但是当时没回答出来,只能听面试官给我解释。还有一个微信扫二维码,这个过程发生了什么,也没回答得很好,不过面试官也很耐心地纠正我回答上的错误。一面顺利通过了,但是总监面挂了。总监面没有问什么技术问题,就是问了问项目和职业规划。自己的项目确实比较 Low,我自己在介绍的时候也说得很不堪。职业规划我说自己希望在一些方面深入学习,因为自己现在在这些方面还很薄弱... 面完之后我就知道挂了,因为整个面试过程我都特别虚,还主动说自己技术能力不行。不出所料,面完的当天晚上,状态变成了不合适。 - -但是过了几天,突然收到腾讯的电话,问我是否愿意去深圳参加面试(笔者学校在广州)。当然我毫不犹豫地答应了,很开心腾讯还能给我机会。经过了上一场面试的启示,这次面试我表现地非常自信,自己知道的知识都很有信心地表达出来,被问到不会的内容也不会那么慌张,和面试官探讨一些细节,然后说说自己的想法,还有自己看过相关的内容。由于这是腾讯云部门,对 Linux 内核和 C++ 有很高的要求,问了几个相关的问题我都没回答出来,比如如何实现守护进程,Linux 信号机制,Linux 线程的不可中断阻塞状态如何进入等等。除了这些问题,其它地回答的都还行。遗憾的是,当天晚上面试官打电话告知我面试没通过。但是他说我其它方面都很不错,所以问我愿不愿意参加腾讯云 Java 部门的招聘,于是第二天我又去了一个新的部门面试。 - -这次面试是在部门的会议室进行的,进到公司之后说实话没有自己想象中那么好,工位很挤环境一般。一开始就先随便聊聊,学校的研究工作,学习之类的。然后看了看项目,看完之后我就知道凉了一半,这个项目确实太水了,面试官看了之后没有接着问,也能感受到面试官有点嫌弃。然后他就问了一些基础知识,问到进程调度算法,面试官让我实现一个任务调度系统。因为是第一次手写代码,而且之前确实没考虑过这个问题,然后就胡乱写了一堆代码,特别乱,而且到处涂改。显然面试官是不满意的,写了也有十几分钟之后,我自己都知道已经凉了,然后面试官没让我接着写,也没给我任何提示,说就到这里,面试结束了,还有没有什么问题想问的。当然看过任务调度系统相关的文章会觉得挺容易的,比如使用时间轮实现等等。我依然记得面试官送我出门时候的热情,送我坐电梯的时候还很热情地和我说,非常感谢参加本次面试,辛苦了。 - -## 虎牙过于自信 - -经过了阿里和腾讯的面试之后,我觉得自己大概已经知道该怎么面试了,面试时候该注意什么,该怎么表达等等。而且腾讯面试表现也不差,虽然最后没通过。所以在虎牙面试的时候特别放松,觉得应该能通过。前面面的也都还行,虽然有几个问题没回答好,比如分析一下微博的时间线。通过了第一轮面试直接等第二轮,等到了晚上七点多才等到我。虎牙面试还是很注重技术的,虽然问的都不是很深入,只要简单回答到点上就不会接着问下去。二面也有一些问题没回答好,比如 ConcurrentHashMap 的并发机制,问 Spring 直接说不会。也有一些问题回答得比较乱,没有条理。但是我觉得大部分问题都回答的不错,应该能通过。可是面试完之后,面试官问有没有什么问题要问他,由于太过放松,我就问你们都加班到这么晚不吃饭吗,好饿啊,周六周日还加班吗... 问完之后面试官就很严肃了,说平常不加班的,我突然意识到了问题的严重性... 最后还是凉了。 - -## 百度第一个 Offer - -被三家连续拒了之后,都开始怀疑自己了,不过还是提醒自己要保持信心。 - -幸运的是,百度的面试非常适合我,三轮都是技术面,而且手写算法题目居多,而我准备最多的是算法,所以很顺利通过了面试。但是面试表现并没有特别好,过了比较长的时间才被捞,而且是工程效率部门,做内部工具的,对个人成长并不好,所以不是特别满意。 - -## 网易游戏最好的面试体验 - -其实最开始没有打算投网易游戏的,因为被脉脉洗脑,已经放弃了做游戏。但是因为前面面试基本被拒了,担心没有实习 Offer,因此就试试看。 - -因为没有特别想去网易游戏,所以面试过程也比较放松,就当去聊聊天。面试官非常 nice,那天下午挤了很久地铁,比较口渴,然后面试官看我说得沙哑了,到门口帮我买了一瓶可乐,非常感激。面试之前我就提出我对 C++ 不熟悉,最近主要看 Java 的内容。面试官还是说没关系,尽量回答就好。当然最后我都把问题往 Java 那里回答了,比如 Map 的实现,内存管理等等。最后聊了一些玩过的游戏,就让我回去等消息。网易游戏就一轮面试,确实就一轮。周五参加的面试,下周一就给 Offer 了,效率特别高。 - -## 微众玄学面试 - -通过微众面试我自己都非常吃惊,一面的时候就简单自我介绍了一下,然后面试官开始介绍他自己的工作经历,以及现在部门在做的内容。之后问了我一个场景分析问题,我想了一会儿没想出来,于是面试官拿起草稿纸把各种需求详细说了一遍,然后把系统架构图也画了出来... 最后他问还有什么我优势的地方他没问到的,我问他怎么不问问算法题,他说笔试都通过了没必要再问。面完之后我觉得聊得很开心,但是技术问题没回答好,出乎意料收到了二面通知。二面没问技术,就让介绍了项目,再问问家住哪之类的问题,也顺利通过了。HR 面就不用介绍。收到了微众的 Offer,得知了部门是贷款科技部,非常核心,很吃香,近几年也在扩展一些业务,还是有点小心动的。虽然最后没选择去微众实习,但是一面面试官加了我微信,我很感谢他一面非常耐心给我讲解,并让我通过。他说我是他面试的第一顺位,也就是第一个面试者,所以会放宽很多,也希望我秋招能加入他们。 - -## 实习选择 - -其实最理想的是去百度实习,秋招也会容易很多。但是考虑到百度是在北京,部门很边缘,而且需要实习很长时间也不一定能转正,所以还是放弃了。最后只能在网易游戏和微众选,虽然自己不想做游戏,但是考虑到网易游戏的平台认可程度比微众好,秋招肯定会更容易一些。而且秋招如果还想进微众的话也会比较容易,因为面试官和 HR 都说秋招的时候会优先考虑我,所以最后还是去了网易游戏实习。 - -## 实习之前的快速学习期 - -经历了春招之后,认识到了自己身上的不足,比如交流表达能力的欠缺,知识积累得不够,项目深度不够。因此在实习之前的两三个月,开始针对这些问题逐个解决。 - -* 交流表达能力欠缺,就提前准备好各种非技术问题,然后对着镜子回答,把自己当成听众,并且也用录音机录下来。 -* 知识积累不够,采取的策略是保证广度优先,并且在重要的内容上保证深度。其实之前基础知识已经掌握的比较好了,再学其它技术的时候都有很多相同的地方,所以学起来很快。 -* 项目深度不够,就把那个微博系统做了一点改进,学了 Spring 之后改用 Java 实现。 - -## 不那么安心的实习 - -去实习的时候还是挺惊喜的,因为我被安排的工作是游戏引擎相关的,和自己的研究生方向紧密相关,我觉得做完实习项目之后自己的毕业论文也会比较有灵感。 - -但不幸的是,在去的第一天部门接待聚餐上,服务端主程就说,我们部门工作制是九九六,现在互联网都是九九六。在实习之前我了解的是实习生六点就可以走,而且只用上五天班,听到他这么一说心都凉透了,因为已经想好了晚上和周末时间用来复习。如果知道是九九六,我会选择去百度。 - -其实网易游戏部门氛围还是不错的,对员工很好,而且我的实习导师人也很好,在我生病的那几天很关心我。但是九九六的工作制对秋招复习还是有很大影响的,而且每天上下班花在路上的时间超过了两个小时,下班回寝室之后总想着看会儿视频休息一下,然后又要早早睡觉赶着第二天上班。没办法只能在上下班地铁上复习,还有就是午休时间接着复习。 - -## 秋招开始 - -实习之后已经是九月份了,那时候已经错过了所有提前批。而且实习的时候没怎么复习,九月初还是感觉没怎么准备充分,所以就又等了半个月才开始投简历。 - -但是这个时候和春招相比,已经把大部分后台研发相关的知识点过了一遍,很多重要的内容前前后后也看了十几遍,没有春招时候那么迷茫和焦虑。即使被问到没有掌握的知识,我也有把握通过讨论的方式,给出大概的思路,因为很多技术确实是相通的。 - -## 阿里看不懂的内部流程 - -秋招第一个投递的依然是阿里,最开始系统自动发起了一个新的流程,然后过了几天自动回绝了... 八月末的时候也找人内推了,但是又被阿里直接回绝了... 那时候已经觉得可能是春招面试表现太差,此生无缘阿里了。可是过了一段时间,正式校招的时候,阿里又发起了一个新的流程戏弄我,收到笔试通知的时候,我还犹豫了到底参不参加,因为那时候已经九月中旬,听说阿里已经没有 HC 了。而且按前面回绝我的态度,感觉即使笔试通过面试也通过不了。笔试那天晚上,本来准备看个电影放松一下,后来想了想还是参加了笔试,笔试各种机器学习和数学题,感觉拿错了试卷,笔试完我已经把阿里从我的公司进度列表中删除了,不再纠结阿里。可是过了一段时间收到阿里的面试通知,我以为是走走形式,可能参加笔试的人很少了,所以才选中我参加面试。那时候阿里招聘官网状态一排的已回绝,让我对阿里有一种恐惧感,觉得面试肯定挂。但是真正面试的时候却意外的顺利,收到二面通知的时候特别激动,然后面完二面又让直接等 HR 面,HR 面虽然不是很理想,但是没有很大的问题。又过了很长一段时间,在我去深圳参加腾讯招聘的高铁上,收到了高德地图 HR 的电话,问是否愿意去。虽然得知部门在北京有点小失落,但是还是很开心终于被阿里认可了,摆脱了对阿里的恐惧。 - -实验室上届毕业在阿里云的大佬某天突然和我说,他们部门有新的 HC,让我把简历发给他,他要帮我内推,会帮我安排一场线下面试,如果通过的话,到时候和高德的 HR 沟通一下,直接把我从高德捞过来。很感谢大佬向他老大极力推荐我,给我了这次面试机会。线下面试也很顺利,聊聊实习项目,问问我的开源博客,然后问些 Paxos 等分布式的问题,还有就是手写代码,信号量实现生产者消费者,以及一个位运算的问题。其实位运算的问题面试的时候写的不完善,面试官让我之后完善了再发给他,因为面试一个多小时有点长了。过后我写了详细文档讲解了思路,以及使用 JUnit 进行了详细的单元测试,把文档和代码都发给了他。现在面试已经通过了,但是最近阿里集团 HC 比较紧张,也不知道能不能批到 HC。 - -## 百度又是不那么满意的部门 - -虽然阿里是最先开始流程,但是第一个参加面试的是百度。因为实习的时候通过了百度的面试,所以这次面试还是比较有信心的。百度面试连续三天,都在同一个地方,最后签约也在同一个地方。还记得每次都坐一个小时左右的地铁去那里,路线已经非常熟悉了,和每天去实习的感觉类似。百度面试比较注重技术,三轮面试基本都是问技术问题,而且问的也比较深入,内容也非常广。但是面的不是那么理想,有两点原因,首先是因为确实有些知识点还没掌握好,比如 AC 自动机,系统故障分析等等;其次是对实习项目的描述上还不够好,没有把实习内容的闪光点描述出来,也没有讲清楚为什么做这个项目,自己通过什么方法去做,以及最后的结果。 - -最后百度给了白菜价,部门是企业智能平台,主要是内部系统,虽然会接触到机器学习和大数据。 - -## 腾讯虐我千百遍 - -秋招腾讯第一场面试和实习参加腾讯面试的感觉非常像,第一轮技术面感觉很好,手写堆排序算法,二部图分析等等。面完之后通知待会儿二面,听到之后还是很激动的,觉得这次应该没问题了。我在等二面的时候,碰到了室友(他经常不住宿舍,所以不清楚他也去面试),聊着聊着居然发现我两是同一个面试官,而且他是来二面的,也就是等一下我两就要一前一后进去面试。二面的感觉和实习二面非常像,非技术问题回答的支支吾吾,然后面试官开始质疑我说的内容,给我压力,我没有当场反驳,就说了哦,好像是这样的。因为面试官全程都绷着脸,所以我也比较紧张,很多问题没回答好。过了几天,室友和我说收到 HR 面试通知了,我去官网看了一下状态,已经变成了熟悉的不合适。这次面试失败的主要原因是自己在应对这种压力时处理地不是很好,主要体现在失去信心以及紧张。解决方法也简单,做好充分准备来保持信心,收到质疑的时候积极反驳,紧张的时候即使调整心态,可以试试深呼吸。 - -因为实习有被捞起来的经历,所以被拒之后我特别希望能继续被捞起来,然后把简历上的面试城市改成了深圳。苦苦等到深圳场面试的前几天,在不经意的一个下午手机突然响了,我记得是短信邮件同时收到面试通知。于是又开始了新一轮被腾讯虐的面试之旅。 - -一面和之前一样也是意外地顺利,虽然问了一些 C++ 的问题,但是我都说到 Java 相关的实现上。在一些问题上确实回答的深度不够,比如网络编程里面的水平触发和边缘触发等问题。然后问了几个算法,本来要求手写,我说我实现过,所以就讲了讲思路。面试和腾讯第一场面试一样持续了一个半小时,面试官也很好,很多问题都会给提示,即使最开始回答的有问题。二面面试官也很好,问了问实习项目,然后再聊一聊一些技术,经过了之前的面试,到这次面试真的就像在聊天一样而不是面试,我们都会说一些对技术上的理解。HR 面其实面得很差,对于非技术问题的吹水能力我还是不太行。最终和我预期的一样,给了我 SP 的 Offer,因为觉得自己面得还可以,但是也不够好到给 SSP,有些 C++ 问题还是没回答的特别好。 - -## 头条意外的惊喜 - -之前看到学弟收到头条的 Offer,薪资非常诱人,所以也想去试试。也听说头条面试难度非常大,主要考察手写算法,因为自己算法方面准备得比较充分,所以觉得会比较顺利,但是也没有特别高的预期。前两面中规中矩,算法题和其它问题我都回答的比较好,到三面的时候,问了一个错排问题,其实最开始我给了正确的递推公式,但不是面试官想要的答案,所以让我再想想。我想了十几分钟还是觉得没问题,那时候觉得自己已经凉了,因为面试官一直不满意。后面的几个问题也没回答的很好,分析一个 SQL 语句的具体执行过程,比如会怎么利用索引,怎么优化之类的,虽然在他的提示下还是回答了,但是感觉并不好。面完之后我立马查了一下那个错排问题,证实了我的答案是正确的,于是写了一个详细的文档,联系 HR 让她发给面试官。出乎意料的是,HR 让我不用担心,他说面试官对我的评价很好... 不过最后还是让她把文档发给了面试官。之后收到了加面通知,头条加面有两种情况,一是三轮评级都是 4 可以评 SSP,二是面试官评价差别很大,再面一轮决定是否录用。收到加面的时候完全不知道自己属于哪一种,感觉两种情况都有可能。加面回答的也不好,主要是问项目,面了 25 分钟就草草结束,最后面试官说有些内容需要找一些文献参考参考。面完之后我觉得,即使我属于第一种要评 SSP 的情况,加面面的那么差应该也没希望了。苦苦等了好多天之后,最后确定是 SSP 之后,还是很惊喜的,感觉是对自己这么长时间复习的一个认可。 - -## 顺丰最后的保底 - -投顺丰是因为九月中旬很多公司都结束了招聘,所以那时候比较慌,就投了顺丰当做保底,顺便也练练手。最开始还担心顺丰笔试没通过,因为编程题最后一题没做出来,那题的题目都出错了,而且题目是网上直接 copy 过来的,网上的源码都不能通过,更别说我自己的实现了。顺丰面试主要问了数据库的内容,而且问的特别深,几乎把每种日志的实现和作用都问了一遍。面顺丰的时候也比较早,那时候有些问题的回答上没有组织好,回答得比较凌乱,虽然最后也算给了一个小 SP。 - -## 华为特别纠结的部门 - -去华为面试确实是没有压力的,因为都知道华为面试不怎么问技术,虽然还是问了我一些技术问题,不过不是问的很深。面试主要介绍项目,我对自己的实习项目还是比较有信心的,因为觉得做的确实不错,而且面了很多场了,知道该怎么介绍项目。面试官问我个人意愿,我说自己对分布式中间件等比较感兴趣,于是面试官把我推荐到了 Cloud Bu。本来没打算签华为的,现场签约也就去看看到底给我开多少。最开始其实给我开了十四级最高的薪资,我本来不是很想去,虽然对这个部门感兴趣,但是薪资确实比不上头条。然后随口问了一句可不可以给十五级,HR 居然说可以... 但是只在绩效加 1k,要是真给十五级确实很有吸引力,股票分红之类的。而且华为也在大力发展这个部门,所以突然就很纠结了。当然升一级需要部门讨论之后才能确定,但是我后面说了我有很多 Offer 可以选择,她也对我这些 Offer 很满意,大概率能评上,但是薪资涨得不多。 - -## 技术博客 - -最后安利一下自己的技术博客:[CS-Notes](https://github.com/CyC2018/CS-Notes),虽然现在还有很多不完善的地方,但以后会不断改进。 - -## 小结 - -很多人都说,面试和考试一样,要背很多没用的东西。最开始我也认同这种看法,可是参加了几场面试之后,我就不这么认为了。因为面试出的问题,有很多是实际开发中碰到的,所以准备面试相当于提前做入职准备。而且面试中考察的思维能力、交流表达能力、应对压力能力,都是真正工作中所需要的。 - -我觉得自己比别人做的好的地方是,有很强烈的想找到好工作的意愿,才驱使我不断学习,所以态度很重要。 - -信心源自于充分准备,有了信心,面试的时候才能游刃有余。而毫无依据的自我感觉良好,在每次失败之后都看不到自身的不足,而是怪罪于外界因素。 - -做好自己的简历,我在简历上花了很长时间,只要允许,我都会用这个简历给面试官演示:[个人简历](https://cyc2018.github.io)。 \ No newline at end of file From 33ec6b8e3b9f46be1911cfb74e4a2badc58591fe Mon Sep 17 00:00:00 2001 From: goto456 Date: Fri, 2 Nov 2018 16:05:49 +0800 Subject: [PATCH 11/55] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E9=94=99=E8=AF=AF?= =?UTF-8?q?=E5=86=85=E5=AE=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit “出先问题” -> “出现问题” --- notes/设计模式.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/notes/设计模式.md b/notes/设计模式.md index 38713e5f..f20a807a 100644 --- a/notes/设计模式.md +++ b/notes/设计模式.md @@ -149,7 +149,7 @@ uniqueInstance 采用 volatile 关键字修饰也是很有必要的, `uniqueIn 2. 初始化 uniqueInstance 3. 将 uniqueInstance 指向分配的内存地址 -但是由于 JVM 具有指令重排的特性,执行顺序有可能变成 1>3>2。指令重排在单线程环境下不会出先问题,但是在多线程环境下会导致一个线程获得还没有初始化的实例。例如,线程 T1 执行了 1 和 3,此时 T2 调用 getUniqueInstance() 后发现 uniqueInstance 不为空,因此返回 uniqueInstance,但此时 uniqueInstance 还未被初始化。 +但是由于 JVM 具有指令重排的特性,执行顺序有可能变成 1>3>2。指令重排在单线程环境下不会出现问题,但是在多线程环境下会导致一个线程获得还没有初始化的实例。例如,线程 T1 执行了 1 和 3,此时 T2 调用 getUniqueInstance() 后发现 uniqueInstance 不为空,因此返回 uniqueInstance,但此时 uniqueInstance 还未被初始化。 使用 volatile 可以禁止 JVM 的指令重排,保证在多线程环境下也能正常运行。 From f7f2809897637e8e7fb3b7709271c09dffa9ed7a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=83=91=E6=B0=B8=E5=B7=9D?= Date: Fri, 16 Nov 2018 16:07:41 +0800 Subject: [PATCH 12/55] Update README.md --- README.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index cdd14ecc..51a55682 100644 --- a/README.md +++ b/README.md @@ -168,10 +168,6 @@ 学习笔记不是从网上到处拼凑而来,除了少部分引用书上和技术文档的原文,其余都是笔者的原创。在您引用本仓库内容或者对内容进行修改演绎时,请遵循文末的开源协议,谢谢。 -#### BookList - -本仓库参考的书目:[BOOKLIST](https://github.com/CyC2018/Interview-Notebook/blob/master/BOOKLIST.md)。 - #### How To Contribute 笔记内容是笔者一个字一个字打上去的,难免会有一些笔误,如果发现笔误可直接对相应文档进行编辑修改。 @@ -180,6 +176,10 @@ 欢迎在 Issue 中提交对本仓库的改进建议~ +#### BookList + +本仓库参考的书目:[BOOKLIST](https://github.com/CyC2018/Interview-Notebook/blob/master/BOOKLIST.md)。 + #### Typesetting 笔记内容按照 [中文文案排版指北](https://mazhuang.org/wiki/chinese-copywriting-guidelines/) 进行排版,以保证内容的可读性。 From 4c2c1aacb7cd60c0ea34601bfaa427098aa6b43a Mon Sep 17 00:00:00 2001 From: CyC2018 <1029579233@qq.com> Date: Fri, 16 Nov 2018 16:09:56 +0800 Subject: [PATCH 13/55] =?UTF-8?q?Update=202018=20=E8=BF=99=E4=B8=80?= =?UTF-8?q?=E5=B9=B4.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 2018 这一年.md | 139 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 139 insertions(+) create mode 100644 2018 这一年.md diff --git a/2018 这一年.md b/2018 这一年.md new file mode 100644 index 00000000..ed3337b0 --- /dev/null +++ b/2018 这一年.md @@ -0,0 +1,139 @@ +作者:CyC2018 + +链接:https://www.nowcoder.com/discuss/137593 + +来源:牛客网 + +## 前言 + +2018,有过迷茫,有过努力,也有很多收获。为了记录这一年以来的感受,于是有了这篇文章。 + +## Offer 情况 + +经过了长达一年左右的复习,秋招也收到了几个比较满意的 Offer,参加面试的都通过了。 + +- 百度,企业智能平台; +- 阿里,高德地图,部门已联系,目前还在申报 Offer 中; +- 腾讯,IEG 游戏平台,后台研发,SP; +- 字节跳动,头条后台研发,SSP; +- 华为,Cloud Bu; +- 网易游戏,梦幻事业部; +- 顺丰科技。 + +## 前期准备 + +也是在去年十一月份左右,看着身边两年制的同学经历了长时间而又艰难的秋招,我开始意识到自己应该提前准备了,否则自己的秋招会很惨。 + +本科的时候,虽然学过计算机网络、操作系统和数据结构等课程,而且 Leetcode 也刷了一两百题,但是离招聘要求还差的很远,学的都很浅只够应付考试,也没有实际的项目经验。 + +我的研究生方向是计算机图形学,研究生期间主要做一些科研项目。在选择招聘方向的时候,我也纠结了是不是找图形学相关方向的,但是考虑到图形学的选择不是很多,所以还是决定投后台研发相关的岗位。 + +于是开始收集各种学习资料,也买了很多纸质书。最开始的学习效率并不是很高,很迷茫,觉得要学的内容很多无从下手。那时候看别人的面经,感觉自己太弱了,很多内容都没接触过,于是更加迷茫。迷茫的时候总想着逃避,要是不复习多好,玩玩游戏每天多简单。但是游戏玩的越多,那种焦虑感越是强烈。解决焦虑的唯一办法就是想办法解决当前问题。当慢慢地从消极的学习态度中调整过来,掌握的知识越多,那种焦虑感也随之消失。当然这个过程并不容易,不仅需要很好的毅力,也要根据自身情况找到问题的有效解决方法。 + +## 春招开始 + +三月份各个公司就开始春招了,那时候刚把一些基础知识简单地复习了一下,Leetcode 刷到了三四百题。但是没有后台研发相关的项目,于是花了一个星期左右用 PHP 做了一个微博系统。当时做简历特别痛苦,没内容可以写,看着其他人简历各种新技术,自己都没掌握,所以很虚。 + +## 阿里一轮游 + +最开始投的阿里,实验室大几届有个师兄在天猫精灵团队,所以给我内推了。于是我人生中第一场面试就是阿里,很自然地被虐了一遍。记得当时约好下午两点电话面试,午饭都没吃,怕吃完之后犯困影响状态,然后找了一个很安静又没人的地方呆到了两点,调整自己的状态。可是面试官突然打电话来说有个会议要开,所以推迟了大概一个小时。苦苦等到三点左右,面试正式开始,不出所料面得非常糟糕。首先自己表述的很有问题,很多内容没回答到关键点上,自己会的内容也不怎么继续扩展回答。其次知识掌握得确实不够,连线程安全、ThreadLocal、函数式编程都不会。虽然被虐的很惨,但是也有好处,知道了面试到底是怎样的,自己还有哪方面的不足,该怎么准备。 + +## 腾讯被鞭尸 + +第二场面试是腾讯,在经历了阿里的面试之后,并且又继续复习了一段时间,我对面试就比较有信心了。一面其实回答的挺理想的,虽然很多问题没有立马回答出来,但是经过面试官的耐心提示之后都能回答一些内容。当时面了一个半小时,面试体验特别好。印象比较深刻的题目有,阅读一个 Redis 源码,分析存在哪些问题。其实就是一个计数器实现的限流算法,会有临界值的问题,但是当时没回答出来,只能听面试官给我解释。还有一个微信扫二维码,这个过程发生了什么,也没回答得很好,不过面试官也很耐心地纠正我回答上的错误。一面顺利通过了,但是总监面挂了。总监面没有问什么技术问题,就是问了问项目和职业规划。自己的项目确实比较 Low,我自己在介绍的时候也说得很不堪。职业规划我说自己希望在一些方面深入学习,因为自己现在在这些方面还很薄弱... 面完之后我就知道挂了,因为整个面试过程我都特别虚,还主动说自己技术能力不行。不出所料,面完的当天晚上,状态变成了不合适。 + +但是过了几天,突然收到腾讯的电话,问我是否愿意去深圳参加面试(笔者学校在广州)。当然我毫不犹豫地答应了,很开心腾讯还能给我机会。经过了上一场面试的启示,这次面试我表现地非常自信,自己知道的知识都很有信心地表达出来,被问到不会的内容也不会那么慌张,和面试官探讨一些细节,然后说说自己的想法,还有自己看过相关的内容。由于这是腾讯云部门,对 Linux 内核和 C++ 有很高的要求,问了几个相关的问题我都没回答出来,比如如何实现守护进程,Linux 信号机制,Linux 线程的不可中断阻塞状态如何进入等等。除了这些问题,其它地回答的都还行。遗憾的是,当天晚上面试官打电话告知我面试没通过。但是他说我其它方面都很不错,所以问我愿不愿意参加腾讯云 Java 部门的招聘,于是第二天我又去了一个新的部门面试。 + +这次面试是在部门的会议室进行的,进到公司之后说实话没有自己想象中那么好,工位很挤环境一般。一开始就先随便聊聊,学校的研究工作,学习之类的。然后看了看项目,看完之后我就知道凉了一半,这个项目确实太水了,面试官看了之后没有接着问,也能感受到面试官有点嫌弃。然后他就问了一些基础知识,问到进程调度算法,面试官让我实现一个任务调度系统。因为是第一次手写代码,而且之前确实没考虑过这个问题,然后就胡乱写了一堆代码,特别乱,而且到处涂改。显然面试官是不满意的,写了也有十几分钟之后,我自己都知道已经凉了,然后面试官没让我接着写,也没给我任何提示,说就到这里,面试结束了,还有没有什么问题想问的。当然看过任务调度系统相关的文章会觉得挺容易的,比如使用时间轮实现等等。我依然记得面试官送我出门时候的热情,送我坐电梯的时候还很热情地和我说,非常感谢参加本次面试,辛苦了。 + +## 虎牙过于自信 + +经过了阿里和腾讯的面试之后,我觉得自己大概已经知道该怎么面试了,面试时候该注意什么,该怎么表达等等。而且腾讯面试表现也不差,虽然最后没通过。所以在虎牙面试的时候特别放松,觉得应该能通过。前面面的也都还行,虽然有几个问题没回答好,比如分析一下微博的时间线。通过了第一轮面试直接等第二轮,等到了晚上七点多才等到我。虎牙面试还是很注重技术的,虽然问的都不是很深入,只要简单回答到点上就不会接着问下去。二面也有一些问题没回答好,比如 ConcurrentHashMap 的并发机制,问 Spring 直接说不会。也有一些问题回答得比较乱,没有条理。但是我觉得大部分问题都回答的不错,应该能通过。可是面试完之后,面试官问有没有什么问题要问他,由于太过放松,我就问你们都加班到这么晚不吃饭吗,好饿啊,周六周日还加班吗... 问完之后面试官就很严肃了,说平常不加班的,我突然意识到了问题的严重性... 最后还是凉了。 + +## 百度第一个 Offer + +被三家连续拒了之后,都开始怀疑自己了,不过还是提醒自己要保持信心。 + +幸运的是,百度的面试非常适合我,三轮都是技术面,而且手写算法题目居多,而我准备最多的是算法,所以很顺利通过了面试。但是面试表现并没有特别好,过了比较长的时间才被捞,而且是工程效率部门,做内部工具的,对个人成长并不好,所以不是特别满意。 + +## 网易游戏最好的面试体验 + +其实最开始没有打算投网易游戏的,因为被脉脉洗脑,已经放弃了做游戏。但是因为前面面试基本被拒了,担心没有实习 Offer,因此就试试看。 + +因为没有特别想去网易游戏,所以面试过程也比较放松,就当去聊聊天。面试官非常 nice,那天下午挤了很久地铁,比较口渴,然后面试官看我说得沙哑了,到门口帮我买了一瓶可乐,非常感激。面试之前我就提出我对 C++ 不熟悉,最近主要看 Java 的内容。面试官还是说没关系,尽量回答就好。当然最后我都把问题往 Java 那里回答了,比如 Map 的实现,内存管理等等。最后聊了一些玩过的游戏,就让我回去等消息。网易游戏就一轮面试,确实就一轮。周五参加的面试,下周一就给 Offer 了,效率特别高。 + +## 微众玄学面试 + +通过微众面试我自己都非常吃惊,一面的时候就简单自我介绍了一下,然后面试官开始介绍他自己的工作经历,以及现在部门在做的内容。之后问了我一个场景分析问题,我想了一会儿没想出来,于是面试官拿起草稿纸把各种需求详细说了一遍,然后把系统架构图也画了出来... 最后他问还有什么我优势的地方他没问到的,我问他怎么不问问算法题,他说笔试都通过了没必要再问。面完之后我觉得聊得很开心,但是技术问题没回答好,出乎意料收到了二面通知。二面没问技术,就让介绍了项目,再问问家住哪之类的问题,也顺利通过了。HR 面就不用介绍。收到了微众的 Offer,得知了部门是贷款科技部,非常核心,很吃香,近几年也在扩展一些业务,还是有点小心动的。虽然最后没选择去微众实习,但是一面面试官加了我微信,我很感谢他一面非常耐心给我讲解,并让我通过。他说我是他面试的第一顺位,也就是第一个面试者,所以会放宽很多,也希望我秋招能加入他们。 + +## 实习选择 + +其实最理想的是去百度实习,秋招也会容易很多。但是考虑到百度是在北京,部门很边缘,而且需要实习很长时间也不一定能转正,所以还是放弃了。最后只能在网易游戏和微众选,虽然自己不想做游戏,但是考虑到网易游戏的平台认可程度比微众好,秋招肯定会更容易一些。而且秋招如果还想进微众的话也会比较容易,因为面试官和 HR 都说秋招的时候会优先考虑我,所以最后还是去了网易游戏实习。 + +## 实习之前的快速学习期 + +经历了春招之后,认识到了自己身上的不足,比如交流表达能力的欠缺,知识积累得不够,项目深度不够。因此在实习之前的两三个月,开始针对这些问题逐个解决。 + +- 交流表达能力欠缺,就提前准备好各种非技术问题,然后对着镜子回答,把自己当成听众,并且也用录音机录下来。 +- 知识积累不够,采取的策略是保证广度优先,并且在重要的内容上保证深度。其实之前基础知识已经掌握的比较好了,再学其它技术的时候都有很多相同的地方,所以学起来很快。 +- 项目深度不够,就把那个微博系统做了一点改进,学了 Spring 之后改用 Java 实现。 + +## 不那么安心的实习 + +去实习的时候还是挺惊喜的,因为我被安排的工作是游戏引擎相关的,和自己的研究生方向紧密相关,我觉得做完实习项目之后自己的毕业论文也会比较有灵感。 + +但不幸的是,在去的第一天部门接待聚餐上,服务端主程就说,我们部门工作制是九九六,现在互联网都是九九六。在实习之前我了解的是实习生六点就可以走,而且只用上五天班,听到他这么一说心都凉透了,因为已经想好了晚上和周末时间用来复习。如果知道是九九六,我会选择去百度。 + +其实网易游戏部门氛围还是不错的,对员工很好,而且我的实习导师人也很好,在我生病的那几天很关心我。但是九九六的工作制对秋招复习还是有很大影响的,而且每天上下班花在路上的时间超过了两个小时,下班回寝室之后总想着看会儿视频休息一下,然后又要早早睡觉赶着第二天上班。没办法只能在上下班地铁上复习,还有就是午休时间接着复习。 + +## 秋招开始 + +实习之后已经是九月份了,那时候已经错过了所有提前批。而且实习的时候没怎么复习,九月初还是感觉没怎么准备充分,所以就又等了半个月才开始投简历。 + +但是这个时候和春招相比,已经把大部分后台研发相关的知识点过了一遍,很多重要的内容前前后后也看了十几遍,没有春招时候那么迷茫和焦虑。即使被问到没有掌握的知识,我也有把握通过讨论的方式,给出大概的思路,因为很多技术确实是相通的。 + +## 阿里看不懂的内部流程 + +秋招第一个投递的依然是阿里,最开始系统自动发起了一个新的流程,然后过了几天自动回绝了... 八月末的时候也找人内推了,但是又被阿里直接回绝了... 那时候已经觉得可能是春招面试表现太差,此生无缘阿里了。可是过了一段时间,正式校招的时候,阿里又发起了一个新的流程戏弄我,收到笔试通知的时候,我还犹豫了到底参不参加,因为那时候已经九月中旬,听说阿里已经没有 HC 了。而且按前面回绝我的态度,感觉即使笔试通过面试也通过不了。笔试那天晚上,本来准备看个电影放松一下,后来想了想还是参加了笔试,笔试各种机器学习和数学题,感觉拿错了试卷,笔试完我已经把阿里从我的公司进度列表中删除了,不再纠结阿里。可是过了一段时间收到阿里的面试通知,我以为是走走形式,可能参加笔试的人很少了,所以才选中我参加面试。那时候阿里招聘官网状态一排的已回绝,让我对阿里有一种恐惧感,觉得面试肯定挂。但是真正面试的时候却意外的顺利,收到二面通知的时候特别激动,然后面完二面又让直接等 HR 面,HR 面虽然不是很理想,但是没有很大的问题。又过了很长一段时间,在我去深圳参加腾讯招聘的高铁上,收到了高德地图 HR 的电话,问是否愿意去。虽然得知部门在北京有点小失落,但是还是很开心终于被阿里认可了,摆脱了对阿里的恐惧。 + +实验室上届毕业在阿里云的大佬某天突然和我说,他们部门有新的 HC,让我把简历发给他,他要帮我内推,会帮我安排一场线下面试,如果通过的话,到时候和高德的 HR 沟通一下,直接把我从高德捞过来。很感谢大佬向他老大极力推荐我,给我了这次面试机会。线下面试也很顺利,聊聊实习项目,问问我的开源博客,然后问些 Paxos 等分布式的问题,还有就是手写代码,信号量实现生产者消费者,以及一个位运算的问题。其实位运算的问题面试的时候写的不完善,面试官让我之后完善了再发给他,因为面试一个多小时有点长了。过后我写了详细文档讲解了思路,以及使用 JUnit 进行了详细的单元测试,把文档和代码都发给了他。现在面试已经通过了,但是最近阿里集团 HC 比较紧张,也不知道能不能批到 HC。 + +## 百度又是不那么满意的部门 + +虽然阿里是最先开始流程,但是第一个参加面试的是百度。因为实习的时候通过了百度的面试,所以这次面试还是比较有信心的。百度面试连续三天,都在同一个地方,最后签约也在同一个地方。还记得每次都坐一个小时左右的地铁去那里,路线已经非常熟悉了,和每天去实习的感觉类似。百度面试比较注重技术,三轮面试基本都是问技术问题,而且问的也比较深入,内容也非常广。但是面的不是那么理想,有两点原因,首先是因为确实有些知识点还没掌握好,比如 AC 自动机,系统故障分析等等;其次是对实习项目的描述上还不够好,没有把实习内容的闪光点描述出来,也没有讲清楚为什么做这个项目,自己通过什么方法去做,以及最后的结果。 + +最后百度给了白菜价,部门是企业智能平台,主要是内部系统,虽然会接触到机器学习和大数据。 + +## 腾讯虐我千百遍 + +秋招腾讯第一场面试和实习参加腾讯面试的感觉非常像,第一轮技术面感觉很好,手写堆排序算法,二部图分析等等。面完之后通知待会儿二面,听到之后还是很激动的,觉得这次应该没问题了。我在等二面的时候,碰到了室友(他经常不住宿舍,所以不清楚他也去面试),聊着聊着居然发现我两是同一个面试官,而且他是来二面的,也就是等一下我两就要一前一后进去面试。二面的感觉和实习二面非常像,非技术问题回答的支支吾吾,然后面试官开始质疑我说的内容,给我压力,我没有当场反驳,就说了哦,好像是这样的。因为面试官全程都绷着脸,所以我也比较紧张,很多问题没回答好。过了几天,室友和我说收到 HR 面试通知了,我去官网看了一下状态,已经变成了熟悉的不合适。这次面试失败的主要原因是自己在应对这种压力时处理地不是很好,主要体现在失去信心以及紧张。解决方法也简单,做好充分准备来保持信心,受到质疑的时候积极反驳,紧张的时候计时调整心态,可以试试深呼吸或者喝水。 + +因为实习有被捞起来的经历,所以被拒之后我特别希望能继续被捞起来,然后把简历上的面试城市改成了深圳。苦苦等到深圳场面试的前几天,在不经意的一个下午手机突然响了,我记得是短信邮件同时收到面试通知。于是又开始了新一轮被腾讯虐的面试之旅。 + +一面和之前一样也是意外地顺利,虽然问了一些 C++ 的问题,但是我都说到 Java 相关的实现上。在一些问题上确实回答的深度不够,比如网络编程里面的水平触发和边缘触发等问题。然后问了几个算法,本来要求手写,我说我实现过,所以就讲了讲思路。面试和腾讯第一场面试一样持续了一个半小时,面试官也很好,很多问题都会给提示,即使最开始回答的有问题。二面面试官也很好,问了问实习项目,然后再聊一聊一些技术,经过了之前的面试,到这次面试真的就像在聊天一样而不是面试,我们都会说一些对技术上的理解。HR 面其实面得很差,对于非技术问题的吹水能力我还是不太行。最终和我预期的一样,给了我 SP 的 Offer,因为觉得自己面得还可以,但是也不够好到给 SSP,有些 C++ 问题还是没回答的特别好。 + +## 头条意外的惊喜 + +之前看到学弟收到头条的 Offer,薪资非常诱人,所以也想去试试。也听说头条面试难度非常大,主要考察手写算法,因为自己算法方面准备得比较充分,所以觉得会比较顺利,但是也没有特别高的预期。前两面中规中矩,算法题和其它问题我都回答的比较好,到三面的时候,问了一个错排问题,其实最开始我给了正确的递推公式,但不是面试官想要的答案,所以让我再想想。我想了十几分钟还是觉得没问题,那时候觉得自己已经凉了,因为面试官一直不满意。后面的几个问题也没回答的很好,分析一个 SQL 语句的具体执行过程,比如会怎么利用索引,怎么优化之类的,虽然在他的提示下还是回答了,但是感觉并不好。面完之后我立马查了一下那个错排问题,证实了我的答案是正确的,于是写了一个详细的文档,联系 HR 让她发给面试官。出乎意料的是,HR 让我不用担心,他说面试官对我的评价很好... 不过最后还是让她把文档发给了面试官。之后收到了加面通知,头条加面有两种情况,一是三轮评级都是 4 可以评 SSP,二是面试官评价差别很大,再面一轮决定是否录用。收到加面的时候完全不知道自己属于哪一种,感觉两种情况都有可能。加面回答的也不好,主要是问项目,面了 25 分钟就草草结束,最后面试官说有些内容需要找一些文献参考参考。面完之后我觉得,即使我属于第一种要评 SSP 的情况,加面面的那么差应该也没希望了。苦苦等了好多天之后,最后确定是 SSP 之后,还是很惊喜的,感觉是对自己这么长时间复习的一个认可。 + +## 顺丰最后的保底 + +投顺丰是因为九月中旬很多公司都结束了招聘,所以那时候比较慌,就投了顺丰当做保底,顺便也练练手。最开始还担心顺丰笔试没通过,因为编程题最后一题没做出来,那题的题目都出错了,而且题目是网上直接 copy 过来的,网上的源码都不能通过,更别说我自己的实现了。顺丰面试主要问了数据库的内容,而且问的特别深,几乎把每种日志的实现和作用都问了一遍。面顺丰的时候也比较早,那时候有些问题的回答上没有组织好,回答得比较凌乱,虽然最后也算给了一个小 SP。 + +## 华为特别纠结的部门 + +去华为面试确实是没有压力的,因为都知道华为面试不怎么问技术,虽然还是问了我一些技术问题,不过不是问的很深。面试主要介绍项目,我对自己的实习项目还是比较有信心的,因为觉得做的确实不错,而且面了很多场了,知道该怎么介绍项目。面试官问我个人意愿,我说自己对分布式中间件等比较感兴趣,于是面试官把我推荐到了 Cloud Bu。本来没打算签华为的,现场签约也就去看看到底给我开多少。最开始其实给我开了十四级最高的薪资,我本来不是很想去,虽然对这个部门感兴趣,但是薪资确实比不上头条。然后随口问了一句可不可以给十五级,本来 HR 说是可以试着申请一下,不过最后没申请成功。 + +## 技术博客 + +最后安利一下自己的技术博客:[CS-Notes](https://github.com/CyC2018/CS-Notes),虽然现在还有很多不完善的地方,但以后会不断改进。 + +## 小结 + +很多人都说,面试和考试一样,要背很多没用的东西。最开始我也认同这种看法,可是参加了几场面试之后,我就不这么认为了。因为面试出的问题,有很多是实际开发中碰到的,所以准备面试相当于提前做入职准备。而且面试中考察的思维能力、交流表达能力、应对压力能力,都是真正工作中所需要的。 + +我觉得自己比别人做的好的地方是,有很强烈的想找到好工作的意愿,才驱使我不断学习,所以态度很重要。 + +信心源自于充分准备,有了信心,面试的时候才能游刃有余。而毫无依据的自我感觉良好,在每次失败之后都看不到自身的不足,而是怪罪于外界因素。 + +做好自己的简历,我在简历上花了很长时间,只要允许,我都会用这个简历给面试官演示:[个人简历](https://cyc2018.github.io)。 \ No newline at end of file From 21a5071e8492e9030a3358db36d4455774c2c340 Mon Sep 17 00:00:00 2001 From: linkwk7 Date: Fri, 16 Nov 2018 19:26:06 +0800 Subject: [PATCH 14/55] Minor fix --- notes/Socket.md | 8 ++++---- notes/计算机操作系统.md | 4 ++-- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/notes/Socket.md b/notes/Socket.md index c188580d..3310fda0 100644 --- a/notes/Socket.md +++ b/notes/Socket.md @@ -178,12 +178,12 @@ else if ( ret == 0 ) else { // If we detect the event, zero it out so we can reuse the structure - if ( pfd[0].revents & POLLIN ) - pfd[0].revents = 0; + if ( fds[0].revents & POLLIN ) + fds[0].revents = 0; // input event on sock1 - if ( pfd[1].revents & POLLOUT ) - pfd[1].revents = 0; + if ( fds[1].revents & POLLOUT ) + fds[1].revents = 0; // output event on sock2 } ``` diff --git a/notes/计算机操作系统.md b/notes/计算机操作系统.md index 8ae04fd2..fbc26212 100644 --- a/notes/计算机操作系统.md +++ b/notes/计算机操作系统.md @@ -613,7 +613,7 @@ void philosopher(int i) { think(); take_two(i); eat(); - put_tow(i); + put_two(i); } } @@ -625,7 +625,7 @@ void take_two(int i) { down(&s[i]); } -void put_tow(i) { +void put_two(i) { down(&mutex); state[i] = THINKING; test(LEFT); From bc62b96686db6443600015bc10d78dbdffefb712 Mon Sep 17 00:00:00 2001 From: linkwk7 Date: Sun, 18 Nov 2018 20:35:34 +0800 Subject: [PATCH 15/55] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E5=88=86=E5=B8=83?= =?UTF-8?q?=E5=BC=8F=E9=83=A8=E5=88=86=E4=B8=AD=E9=83=A8=E5=88=86=E6=8F=8F?= =?UTF-8?q?=E8=BF=B0=E4=B8=8D=E5=87=86=E7=A1=AE=E7=9A=84=E5=9C=B0=E6=96=B9?= =?UTF-8?q?=EF=BC=8C=E4=BF=AE=E6=94=B9Paxos=E9=83=A8=E5=88=86=E6=8F=8F?= =?UTF-8?q?=E8=BF=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- notes/分布式.md | 34 ++++++++-------------------------- 1 file changed, 8 insertions(+), 26 deletions(-) diff --git a/notes/分布式.md b/notes/分布式.md index 5af9c400..abaf989f 100644 --- a/notes/分布式.md +++ b/notes/分布式.md @@ -173,7 +173,7 @@ Zookeeper 提供了一种树形结构级的命名空间,/app1/p_1 节点的父 网络分区指分布式系统中的节点被划分为多个区域,每个区域内部可以通信,但是区域之间无法通信。 -在分区容忍性条件下,分布式系统在遇到任何网络分区故障的时候,仍然需要能对外提供一致性和可用性的服务,除非是整个网络环境都发生了故障。 +在分区容忍性条件下,分布式系统在遇到任何网络分区故障的时候,仍然需要能对外提供服务,除非是整个网络环境都发生了故障。 ## 权衡 @@ -181,7 +181,7 @@ Zookeeper 提供了一种树形结构级的命名空间,/app1/p_1 节点的父 可用性和一致性往往是冲突的,很难使它们同时满足。在多个节点之间进行数据同步时, -- 为了保证一致性(CP),就需要让所有节点下线成为不可用的状态,等待同步完成; +- 为了保证一致性(CP),需要牺牲部分节点的可用性(即部分节点虽仍正常工作但不会响应用户请求),但保证读出的数据一定是具有强一致性的; - 为了保证可用性(AP),在同步过程中允许读取所有节点的数据,但是数据可能不一致。

@@ -226,35 +226,17 @@ ACID 要求强一致性,通常运用在传统的数据库系统上。而 BASE ## 执行过程 -规定一个提议包含两个字段:[n, v],其中 n 为序号(具有唯一性),v 为提议值。 +规定一个提议包含一个提议序号 n,其中序号具有唯一性。 -下图演示了两个 Proposer 和三个 Acceptor 的系统中运行该算法的初始过程,每个 Proposer 都会向所有 Acceptor 发送提议请求。 +当 Acceptor 接收到一个Prepare请求,包含的提议序号为 n1 ,并且之前还未接收过Prepare请求,那么发送一个响应,设置当前接收到的提议为 n1 ,并且保证以后不会再接受序号小于 n1 的提议。 -

+如果 Acceptor 接收到一个Prepare请求,其包含的提议号为 n2,如果 n2 大于其之前响应的所有的 Prepare 消息所附带的提议号,并且大于其之前响应的所有 Accept 消息所附带的提议号,则发送响应消息,并在响应消息中附带上其已经 Accept 过的提议,并保证不再接受序号小于 n2 的消息。 -当 Acceptor 接收到一个提议请求,包含的提议为 [n1, v1],并且之前还未接收过提议请求,那么发送一个提议响应,设置当前接收到的提议为 [n1, v1],并且保证以后不会再接受序号小于 n1 的提议。 +当一个 Proposer 接收到超过一半 Acceptor 的 Prepare 响应时,就可以发送 Accept 请求。Accept 请求包括 Prepare 阶段使用的提议号以及提议值,如果 Prepare阶段没有 Acceptor 回应任何已经 Accept 的值则该 Proposer 可以自己选择一个,否则使用 Prepare 阶段中所有收到的值中提议序号最高的一个。 -如下图,Acceptor X 在收到 [n=2, v=8] 的提议请求时,由于之前没有接收过提议,因此就发送一个 [no previous] 的提议响应,设置当前接收到的提议为 [n=2, v=8],并且保证以后不会再接受序号小于 2 的提议。其它的 Acceptor 类似。 +Acceptor 收到 Accept 请求后,如果该请求中的提议序号大于等于其已经 Accept 或者在 Prepare 阶段收到的提议的序号,则接受该值。否则丢弃该消息。 -

- -如果 Acceptor 接收到一个提议请求,包含的提议为 [n2, v2],并且之前已经接收过提议 [n1, v1]。如果 n1 > n2,那么就丢弃该提议请求;否则,发送提议响应,该提议响应包含之前已经接收过的提议 [n1, v1],设置当前接收到的提议为 [n2, v2],并且保证以后不会再接受序号小于 n2 的提议。 - -如下图,Acceptor Z 收到 Proposer A 发来的 [n=2, v=8] 的提议请求,由于之前已经接收过 [n=4, v=5] 的提议,并且 n > 2,因此就抛弃该提议请求;Acceptor X 收到 Proposer B 发来的 [n=4, v=5] 的提议请求,因为之前接收到的提议为 [n=2, v=8],并且 2 <= 4,因此就发送 [n=2, v=8] 的提议响应,设置当前接收到的提议为 [n=4, v=5],并且保证以后不会再接受序号小于 4 的提议。Acceptor Y 类似。 - -

- -当一个 Proposer 接收到超过一半 Acceptor 的提议响应时,就可以发送接受请求。 - -Proposer A 接收到两个提议响应之后,就发送 [n=2, v=8] 接受请求。该接受请求会被所有 Acceptor 丢弃,因为此时所有 Acceptor 都保证不接受序号小于 4 的提议。 - -Proposer B 过后也收到了两个提议响应,因此也开始发送接受请求。需要注意的是,接受请求的 v 需要取它收到的最大 v 值,也就是 8。因此它发送 [n=4, v=8] 的接受请求。 - -

- -Acceptor 接收到接受请求时,如果序号大于等于该 Acceptor 承诺的最小序号,那么就发送通知给所有的 Learner。当 Learner 发现有大多数的 Acceptor 接收了某个提议,那么该提议的提议值就被 Paxos 选择出来。 - -

+Acceptor 接收到 Accept 请求时,如果序号大于等于该 Acceptor 承诺的最小序号,那么就发送通知给所有的 Learner。当 Learner 发现有大多数的 Acceptor 接收了某个提议,那么该提议的提议值就被 Paxos 选择出来。 ## 约束条件 From a6e1a4d672c0c1cbfb48c60e82b37bc768c2975a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=9D=B3=E9=98=B3?= <260893248@qq.com> Date: Mon, 19 Nov 2018 19:57:54 +0800 Subject: [PATCH 16/55] implement -> implements implement -> implements --- notes/面向对象思想.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/notes/面向对象思想.md b/notes/面向对象思想.md index 667ba3e1..154e44a7 100644 --- a/notes/面向对象思想.md +++ b/notes/面向对象思想.md @@ -149,7 +149,7 @@ Vihical <|-- Trunck ## 实现关系 (Realization) -用来实现一个接口,在 Java 中使用 implement 关键字。 +用来实现一个接口,在 Java 中使用 implements 关键字。

From d90eb6fc0015fe5d2a5ea7073323dbcac5c756d8 Mon Sep 17 00:00:00 2001 From: CyC2018 <1029579233@qq.com> Date: Tue, 20 Nov 2018 00:36:58 +0800 Subject: [PATCH 17/55] auto commit --- notes/分布式.md | 42 ++++++++++++++++++++++++++++++++--------- notes/计算机操作系统.md | 2 +- notes/设计模式.md | 2 +- 3 files changed, 35 insertions(+), 11 deletions(-) diff --git a/notes/分布式.md b/notes/分布式.md index abaf989f..8c2adf87 100644 --- a/notes/分布式.md +++ b/notes/分布式.md @@ -173,7 +173,7 @@ Zookeeper 提供了一种树形结构级的命名空间,/app1/p_1 节点的父 网络分区指分布式系统中的节点被划分为多个区域,每个区域内部可以通信,但是区域之间无法通信。 -在分区容忍性条件下,分布式系统在遇到任何网络分区故障的时候,仍然需要能对外提供服务,除非是整个网络环境都发生了故障。 +在分区容忍性条件下,分布式系统在遇到任何网络分区故障的时候,仍然需要能对外提供一致性和可用性的服务,除非是整个网络环境都发生了故障。 ## 权衡 @@ -181,8 +181,8 @@ Zookeeper 提供了一种树形结构级的命名空间,/app1/p_1 节点的父 可用性和一致性往往是冲突的,很难使它们同时满足。在多个节点之间进行数据同步时, -- 为了保证一致性(CP),需要牺牲部分节点的可用性(即部分节点虽仍正常工作但不会响应用户请求),但保证读出的数据一定是具有强一致性的; -- 为了保证可用性(AP),在同步过程中允许读取所有节点的数据,但是数据可能不一致。 +- 为了保证一致性(CP),不能访问未同步完成的节点,也就失去了部分可用性; +- 为了保证可用性(AP),允许读取所有节点的数据,但是数据可能不一致。

@@ -226,17 +226,41 @@ ACID 要求强一致性,通常运用在传统的数据库系统上。而 BASE ## 执行过程 -规定一个提议包含一个提议序号 n,其中序号具有唯一性。 +规定一个提议包含两个字段:[n, v],其中 n 为序号(具有唯一性),v 为提议值。 -当 Acceptor 接收到一个Prepare请求,包含的提议序号为 n1 ,并且之前还未接收过Prepare请求,那么发送一个响应,设置当前接收到的提议为 n1 ,并且保证以后不会再接受序号小于 n1 的提议。 +### 1. Prepare 阶段 -如果 Acceptor 接收到一个Prepare请求,其包含的提议号为 n2,如果 n2 大于其之前响应的所有的 Prepare 消息所附带的提议号,并且大于其之前响应的所有 Accept 消息所附带的提议号,则发送响应消息,并在响应消息中附带上其已经 Accept 过的提议,并保证不再接受序号小于 n2 的消息。 +下图演示了两个 Proposer 和三个 Acceptor 的系统中运行该算法的初始过程,每个 Proposer 都会向所有 Acceptor 发送 Prepare 请求。 -当一个 Proposer 接收到超过一半 Acceptor 的 Prepare 响应时,就可以发送 Accept 请求。Accept 请求包括 Prepare 阶段使用的提议号以及提议值,如果 Prepare阶段没有 Acceptor 回应任何已经 Accept 的值则该 Proposer 可以自己选择一个,否则使用 Prepare 阶段中所有收到的值中提议序号最高的一个。 +

-Acceptor 收到 Accept 请求后,如果该请求中的提议序号大于等于其已经 Accept 或者在 Prepare 阶段收到的提议的序号,则接受该值。否则丢弃该消息。 +当 Acceptor 接收到一个 Prepare 请求,包含的提议为 [n1, v1],并且之前还未接收过 Prepare 请求,那么发送一个 Prepare 响应,设置当前接收到的提议为 [n1, v1],并且保证以后不会再接受序号小于 n1 的提议。 -Acceptor 接收到 Accept 请求时,如果序号大于等于该 Acceptor 承诺的最小序号,那么就发送通知给所有的 Learner。当 Learner 发现有大多数的 Acceptor 接收了某个提议,那么该提议的提议值就被 Paxos 选择出来。 +如下图,Acceptor X 在收到 [n=2, v=8] 的 Prepare 请求时,由于之前没有接收过提议,因此就发送一个 [no previous] 的 Prepare 响应,设置当前接收到的提议为 [n=2, v=8],并且保证以后不会再接受序号小于 2 的提议。其它的 Acceptor 类似。 + +

+ +如果 Acceptor 接收到一个 Prepare 请求,包含的提议为 [n2, v2],并且之前已经接收过提议 [n1, v1]。如果 n1 > n2,那么就丢弃该提议请求;否则,发送 Prepare 响应,该 Prepare 响应包含之前已经接收过的提议 [n1, v1],设置当前接收到的提议为 [n2, v2],并且保证以后不会再接受序号小于 n2 的提议。 + +如下图,Acceptor Z 收到 Proposer A 发来的 [n=2, v=8] 的 Prepare 请求,由于之前已经接收过 [n=4, v=5] 的提议,并且 n > 2,因此就抛弃该提议请求;Acceptor X 收到 Proposer B 发来的 [n=4, v=5] 的 Prepare 请求,因为之前接收到的提议为 [n=2, v=8],并且 2 <= 4,因此就发送 [n=2, v=8] 的 Prepare 响应,设置当前接收到的提议为 [n=4, v=5],并且保证以后不会再接受序号小于 4 的提议。Acceptor Y 类似。 + +

+ +### 2. Accept 阶段 + +当一个 Proposer 接收到超过一半 Acceptor 的 Prepare 响应时,就可以发送 Accept 请求。 + +Proposer A 接收到两个 Prepare 响应之后,就发送 [n=2, v=8] Accept 请求。该 Accept 请求会被所有 Acceptor 丢弃,因为此时所有 Acceptor 都保证不接受序号小于 4 的提议。 + +Proposer B 过后也收到了两个 Prepare 响应,因此也开始发送 Accept 请求。需要注意的是,Accept 请求的 v 需要取它收到的最大 v 值,也就是 8。因此它发送 [n=4, v=8] 的 Accept 请求。 + +

+ +### 3. Learn 阶段 + +Acceptor 接收到 Accept 请求时,如果序号大于等于该 Acceptor 承诺的最小序号,那么就发送 Learn 提议给所有的 Learner。当 Learner 发现有大多数的 Acceptor 接收了某个提议,那么该提议的提议值就被 Paxos 选择出来。 + +

## 约束条件 diff --git a/notes/计算机操作系统.md b/notes/计算机操作系统.md index fbc26212..56dc401e 100644 --- a/notes/计算机操作系统.md +++ b/notes/计算机操作系统.md @@ -625,7 +625,7 @@ void take_two(int i) { down(&s[i]); } -void put_two(i) { +void put_tow(i) { down(&mutex); state[i] = THINKING; test(LEFT); diff --git a/notes/设计模式.md b/notes/设计模式.md index f20a807a..38713e5f 100644 --- a/notes/设计模式.md +++ b/notes/设计模式.md @@ -149,7 +149,7 @@ uniqueInstance 采用 volatile 关键字修饰也是很有必要的, `uniqueIn 2. 初始化 uniqueInstance 3. 将 uniqueInstance 指向分配的内存地址 -但是由于 JVM 具有指令重排的特性,执行顺序有可能变成 1>3>2。指令重排在单线程环境下不会出现问题,但是在多线程环境下会导致一个线程获得还没有初始化的实例。例如,线程 T1 执行了 1 和 3,此时 T2 调用 getUniqueInstance() 后发现 uniqueInstance 不为空,因此返回 uniqueInstance,但此时 uniqueInstance 还未被初始化。 +但是由于 JVM 具有指令重排的特性,执行顺序有可能变成 1>3>2。指令重排在单线程环境下不会出先问题,但是在多线程环境下会导致一个线程获得还没有初始化的实例。例如,线程 T1 执行了 1 和 3,此时 T2 调用 getUniqueInstance() 后发现 uniqueInstance 不为空,因此返回 uniqueInstance,但此时 uniqueInstance 还未被初始化。 使用 volatile 可以禁止 JVM 的指令重排,保证在多线程环境下也能正常运行。 From 4401fcf1b8c77cc4b90c5958614057211668d484 Mon Sep 17 00:00:00 2001 From: CyC2018 <1029579233@qq.com> Date: Tue, 20 Nov 2018 17:12:04 +0800 Subject: [PATCH 18/55] auto commit --- notes/Java 容器.md | 4 ++-- notes/Java 虚拟机.md | 2 +- notes/计算机操作系统.md | 2 +- notes/设计模式.md | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/notes/Java 容器.md b/notes/Java 容器.md index c5a41bc0..1db0d845 100644 --- a/notes/Java 容器.md +++ b/notes/Java 容器.md @@ -646,8 +646,8 @@ static int indexFor(int h, int length) { | 参数 | 含义 | | :--: | :-- | | capacity | table 的容量大小,默认为 16。需要注意的是 capacity 必须保证为 2 的 n 次方。| -| size | table 的实际使用量。 | -| threshold | size 的临界值,size 必须小于 threshold,如果大于等于,就必须进行扩容操作。 | +| size | 键值对数量。 | +| threshold | size 的临界值,当 size 大于等于 threshold 就必须进行扩容操作。 | | loadFactor | 装载因子,table 能够使用的比例,threshold = capacity * loadFactor。| ```java diff --git a/notes/Java 虚拟机.md b/notes/Java 虚拟机.md index 2dafe334..e24015c5 100644 --- a/notes/Java 虚拟机.md +++ b/notes/Java 虚拟机.md @@ -227,7 +227,7 @@ obj = null;

-将存活的对象进行标记,然后清理掉未被标记的对象。 +标记要回收的对象,然后清除。 不足: diff --git a/notes/计算机操作系统.md b/notes/计算机操作系统.md index 56dc401e..fbc26212 100644 --- a/notes/计算机操作系统.md +++ b/notes/计算机操作系统.md @@ -625,7 +625,7 @@ void take_two(int i) { down(&s[i]); } -void put_tow(i) { +void put_two(i) { down(&mutex); state[i] = THINKING; test(LEFT); diff --git a/notes/设计模式.md b/notes/设计模式.md index 38713e5f..f20a807a 100644 --- a/notes/设计模式.md +++ b/notes/设计模式.md @@ -149,7 +149,7 @@ uniqueInstance 采用 volatile 关键字修饰也是很有必要的, `uniqueIn 2. 初始化 uniqueInstance 3. 将 uniqueInstance 指向分配的内存地址 -但是由于 JVM 具有指令重排的特性,执行顺序有可能变成 1>3>2。指令重排在单线程环境下不会出先问题,但是在多线程环境下会导致一个线程获得还没有初始化的实例。例如,线程 T1 执行了 1 和 3,此时 T2 调用 getUniqueInstance() 后发现 uniqueInstance 不为空,因此返回 uniqueInstance,但此时 uniqueInstance 还未被初始化。 +但是由于 JVM 具有指令重排的特性,执行顺序有可能变成 1>3>2。指令重排在单线程环境下不会出现问题,但是在多线程环境下会导致一个线程获得还没有初始化的实例。例如,线程 T1 执行了 1 和 3,此时 T2 调用 getUniqueInstance() 后发现 uniqueInstance 不为空,因此返回 uniqueInstance,但此时 uniqueInstance 还未被初始化。 使用 volatile 可以禁止 JVM 的指令重排,保证在多线程环境下也能正常运行。 From f7e9cfeca40f17b52765119de3247fc7e22ceae0 Mon Sep 17 00:00:00 2001 From: CyC2018 <1029579233@qq.com> Date: Tue, 20 Nov 2018 17:23:33 +0800 Subject: [PATCH 19/55] =?UTF-8?q?Delete=20CyC=20=E5=AD=A6=E4=B9=A0?= =?UTF-8?q?=E4=BA=A4=E6=B5=81=E7=BE=A4=20=E9=97=AE=E9=A2=98=E6=B1=87?= =?UTF-8?q?=E6=80=BB.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- notes/CyC 学习交流群 问题汇总.md | 16 ---------------- 1 file changed, 16 deletions(-) delete mode 100644 notes/CyC 学习交流群 问题汇总.md diff --git a/notes/CyC 学习交流群 问题汇总.md b/notes/CyC 学习交流群 问题汇总.md deleted file mode 100644 index 806d48d0..00000000 --- a/notes/CyC 学习交流群 问题汇总.md +++ /dev/null @@ -1,16 +0,0 @@ - -* [0. 进程内存空间中,堆和栈的区别](#0-进程内存空间中,堆和栈的区别) - - - -# 0. 进程内存空间中,堆和栈的区别 - -> C++ - -堆:动态、malloc()、new、链式分配、向上生长;栈:函数调用、编译器分配回收、向下生长。 - -https://www.cnblogs.com/sunziying/p/6510030.html - -By @CyC - ---- From d1e160c8fe1f943df6840e929f55e76dd75f6ab5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=9D=B3=E9=98=B3?= <260893248@qq.com> Date: Tue, 20 Nov 2018 19:06:15 +0800 Subject: [PATCH 20/55] =?UTF-8?q?=E6=9A=82=E7=BC=93=E5=8C=BA->=E6=9A=82?= =?UTF-8?q?=E5=AD=98=E5=8C=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 暂缓区->暂存区 --- notes/Git.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/notes/Git.md b/notes/Git.md index 71ff502c..4d4cbb2b 100644 --- a/notes/Git.md +++ b/notes/Git.md @@ -44,14 +44,14 @@ Git 版本库有一个称为 stage 的暂存区,还有自动创建的 master - git add files 把文件的修改添加到暂存区 - git commit 把暂存区的修改提交到当前分支,提交之后暂存区就被清空了 -- git reset -- files 使用当前分支上的修改覆盖暂缓区,用来撤销最后一次 git add files +- git reset -- files 使用当前分支上的修改覆盖暂存区,用来撤销最后一次 git add files - git checkout -- files 使用暂存区的修改覆盖工作目录,用来撤销本地修改

可以跳过暂存区域直接从分支中取出修改,或者直接提交修改到分支中。 -- git commit -a 直接把所有文件的修改添加到暂缓区然后执行提交 +- git commit -a 直接把所有文件的修改添加到暂存区然后执行提交 - git checkout HEAD -- files 取出最后一次修改,可以用来进行回滚操作 # 分支实现 From 0d98ecfbacb45254f74608dfcead3ae463975830 Mon Sep 17 00:00:00 2001 From: CyC2018 <1029579233@qq.com> Date: Tue, 20 Nov 2018 22:41:09 +0800 Subject: [PATCH 21/55] auto commit --- notes/CyC 学习交流群 问题汇总.md | 16 ++++++++++++++++ notes/Java 虚拟机.md | 4 ++-- pics/28ab96b4-82ea-4d99-99fb-b320f60d0a58.png | Bin 0 -> 24576 bytes pics/85370d54-40d1-4912-bcbe-37a2481c861d.png | Bin 0 -> 40960 bytes 4 files changed, 18 insertions(+), 2 deletions(-) create mode 100644 notes/CyC 学习交流群 问题汇总.md create mode 100644 pics/28ab96b4-82ea-4d99-99fb-b320f60d0a58.png create mode 100644 pics/85370d54-40d1-4912-bcbe-37a2481c861d.png diff --git a/notes/CyC 学习交流群 问题汇总.md b/notes/CyC 学习交流群 问题汇总.md new file mode 100644 index 00000000..806d48d0 --- /dev/null +++ b/notes/CyC 学习交流群 问题汇总.md @@ -0,0 +1,16 @@ + +* [0. 进程内存空间中,堆和栈的区别](#0-进程内存空间中,堆和栈的区别) + + + +# 0. 进程内存空间中,堆和栈的区别 + +> C++ + +堆:动态、malloc()、new、链式分配、向上生长;栈:函数调用、编译器分配回收、向下生长。 + +https://www.cnblogs.com/sunziying/p/6510030.html + +By @CyC + +--- diff --git a/notes/Java 虚拟机.md b/notes/Java 虚拟机.md index e24015c5..3138a170 100644 --- a/notes/Java 虚拟机.md +++ b/notes/Java 虚拟机.md @@ -30,7 +30,7 @@ # 一、运行时数据区域 -

+

## 程序计数器 @@ -40,7 +40,7 @@ 每个 Java 方法在执行的同时会创建一个栈帧用于存储局部变量表、操作数栈、常量池引用等信息。从方法调用直至执行完成的过程,就对应着一个栈帧在 Java 虚拟机栈中入栈和出栈的过程。 -

+

可以通过 -Xss 这个虚拟机参数来指定每个线程的 Java 虚拟机栈内存大小: diff --git a/pics/28ab96b4-82ea-4d99-99fb-b320f60d0a58.png b/pics/28ab96b4-82ea-4d99-99fb-b320f60d0a58.png new file mode 100644 index 0000000000000000000000000000000000000000..8072abc5992d7033714c1252254c23c74e42fa09 GIT binary patch literal 24576 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 literal 0 HcmV?d00001 diff --git a/pics/85370d54-40d1-4912-bcbe-37a2481c861d.png b/pics/85370d54-40d1-4912-bcbe-37a2481c861d.png new file mode 100644 index 0000000000000000000000000000000000000000..f1664e136191e9bc59fbbf7dd5b1d67a2c109fc6 GIT binary patch literal 40960 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 Date: Wed, 21 Nov 2018 19:46:52 +0800 Subject: [PATCH 22/55] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E4=B8=8D=E8=83=BD?= =?UTF-8?q?=E8=AE=BF=E9=97=AE=E7=9A=84=E9=93=BE=E6=8E=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 修复不能访问的链接 --- notes/Java IO.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/notes/Java IO.md b/notes/Java IO.md index e137fb7b..105991a8 100644 --- a/notes/Java IO.md +++ b/notes/Java IO.md @@ -611,7 +611,7 @@ NIO 与普通 I/O 的区别主要有以下两点: - [Java NIO Tutorial](http://tutorials.jenkov.com/java-nio/index.html) - [Java NIO 浅析](https://tech.meituan.com/nio.html) - [IBM: 深入分析 Java I/O 的工作机制](https://www.ibm.com/developerworks/cn/java/j-lo-javaio/index.html) -- [IBM: 深入分析 Java 中的中文编码问题](https://www.ibm.com/developerworks/cn/java/j-lo-chinesecoding/index.htm) +- [IBM: 深入分析 Java 中的中文编码问题](https://www.ibm.com/developerworks/cn/java/j-lo-chinesecoding/index.html) - [IBM: Java 序列化的高级认识](https://www.ibm.com/developerworks/cn/java/j-lo-serial/index.html) - [NIO 与传统 IO 的区别](http://blog.csdn.net/shimiso/article/details/24990499) - [Decorator Design Pattern](http://stg-tud.github.io/sedc/Lecture/ws13-14/5.3-Decorator.html#mode=document) From ed43f0151563d579d776656842e946bc062cfd02 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=9D=B3=E9=98=B3?= <260893248@qq.com> Date: Thu, 22 Nov 2018 19:46:13 +0800 Subject: [PATCH 23/55] classfier->classifier MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 修改两处拼写错误 --- notes/构建工具.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/notes/构建工具.md b/notes/构建工具.md index 34fef54b..c0bf1714 100644 --- a/notes/构建工具.md +++ b/notes/构建工具.md @@ -96,7 +96,7 @@ POM 代表项目对象模型,它是一个 XML 文件,保存在项目根目 ``` -[groupId, artifactId, version, packaging, classfier] 称为一个项目的坐标,其中 groupId、artifactId、version 必须定义,packaging 可选(默认为 Jar),classfier 不能直接定义的,需要结合插件使用。 +[groupId, artifactId, version, packaging, classifier] 称为一个项目的坐标,其中 groupId、artifactId、version 必须定义,packaging 可选(默认为 Jar),classifier 不能直接定义的,需要结合插件使用。 - groupId:项目组 Id,必须全球唯一; - artifactId:项目 Id,即项目名; From 11cf1a76cc42134e0ec41b796275637b27f1a26d Mon Sep 17 00:00:00 2001 From: ZYSzys <17367077526@163.com> Date: Fri, 23 Nov 2018 18:08:05 +0800 Subject: [PATCH 24/55] update OPT --- notes/计算机操作系统.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/notes/计算机操作系统.md b/notes/计算机操作系统.md index fbc26212..7ea7a118 100644 --- a/notes/计算机操作系统.md +++ b/notes/计算机操作系统.md @@ -861,7 +861,7 @@ FIFO 常用于客户-服务器应用程序中,FIFO 用作汇聚点,在客户 ### 1. 最佳 -> Optimal +> OPT, Optimal replacement algorithm 所选择的被换出的页面将是最长时间内不再被访问,通常可以保证获得最低的缺页率。 From bdb8189bcc7a46268cdb64655638c73aeaf368b2 Mon Sep 17 00:00:00 2001 From: CyC2018 <1029579233@qq.com> Date: Sat, 24 Nov 2018 11:12:37 +0800 Subject: [PATCH 25/55] auto commit --- notes/CyC 学习交流群 问题汇总.md | 16 ---------------- notes/数据库系统原理.md | 2 +- notes/构建工具.md | 1 + 3 files changed, 2 insertions(+), 17 deletions(-) delete mode 100644 notes/CyC 学习交流群 问题汇总.md diff --git a/notes/CyC 学习交流群 问题汇总.md b/notes/CyC 学习交流群 问题汇总.md deleted file mode 100644 index 806d48d0..00000000 --- a/notes/CyC 学习交流群 问题汇总.md +++ /dev/null @@ -1,16 +0,0 @@ - -* [0. 进程内存空间中,堆和栈的区别](#0-进程内存空间中,堆和栈的区别) - - - -# 0. 进程内存空间中,堆和栈的区别 - -> C++ - -堆:动态、malloc()、new、链式分配、向上生长;栈:函数调用、编译器分配回收、向下生长。 - -https://www.cnblogs.com/sunziying/p/6510030.html - -By @CyC - ---- diff --git a/notes/数据库系统原理.md b/notes/数据库系统原理.md index 36e2a90d..6e910f37 100644 --- a/notes/数据库系统原理.md +++ b/notes/数据库系统原理.md @@ -221,8 +221,8 @@ MySQL 中提供了两种封锁粒度:行级锁以及表级锁。 | unlock-x(A) |. | | | obtain | | | read A=20 | -| | commit | | | unlock-s(A)| +| | commit | **三级封锁协议** diff --git a/notes/构建工具.md b/notes/构建工具.md index c0bf1714..ed38709e 100644 --- a/notes/构建工具.md +++ b/notes/构建工具.md @@ -98,6 +98,7 @@ POM 代表项目对象模型,它是一个 XML 文件,保存在项目根目 [groupId, artifactId, version, packaging, classifier] 称为一个项目的坐标,其中 groupId、artifactId、version 必须定义,packaging 可选(默认为 Jar),classifier 不能直接定义的,需要结合插件使用。 + - groupId:项目组 Id,必须全球唯一; - artifactId:项目 Id,即项目名; - version:项目版本; From 592bf84100dcbc1e6586887263a6d7d213bfec51 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=9D=B3=E9=98=B3?= <260893248@qq.com> Date: Sat, 24 Nov 2018 17:53:51 +0800 Subject: [PATCH 26/55] farward -> forward MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 修正一处拼写错误 --- notes/Git.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/notes/Git.md b/notes/Git.md index 4d4cbb2b..d1d4c281 100644 --- a/notes/Git.md +++ b/notes/Git.md @@ -90,7 +90,7 @@ Creating a new branch is quick AND simple. # Fast forward -"快进式合并"(fast-farward merge),会直接将 master 分支指向合并的分支,这种模式下进行分支合并会丢失分支信息,也就不能在分支历史上看出分支信息。 +"快进式合并"(fast-forward merge),会直接将 master 分支指向合并的分支,这种模式下进行分支合并会丢失分支信息,也就不能在分支历史上看出分支信息。 可以在合并时加上 --no-ff 参数来禁用 Fast forward 模式,并且加上 -m 参数让合并时产生一个新的 commit。 From c39da28ed5ecf25e6f6933010bac6b66c16389fe Mon Sep 17 00:00:00 2001 From: JingTao Chen Date: Sat, 24 Nov 2018 20:28:23 +0800 Subject: [PATCH 27/55] =?UTF-8?q?Update=20=E5=89=91=E6=8C=87=20offer=20?= =?UTF-8?q?=E9=A2=98=E8=A7=A3.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- notes/剑指 offer 题解.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/notes/剑指 offer 题解.md b/notes/剑指 offer 题解.md index 54ed6cd2..c8711c97 100644 --- a/notes/剑指 offer 题解.md +++ b/notes/剑指 offer 题解.md @@ -724,7 +724,7 @@ private char[][] buildMatrix(char[] array) { 地上有一个 m 行和 n 列的方格。一个机器人从坐标 (0, 0) 的格子开始移动,每一次只能向左右上下四个方向移动一格,但是不能进入行坐标和列坐标的数位之和大于 k 的格子。 -例如,当 k 为 18 时,机器人能够进入方格 (35,37),因为 3+5+3+7=18。但是,它不能进入方格 (35,37),因为 3+5+3+8=19。请问该机器人能够达到多少个格子? +例如,当 k 为 18 时,机器人能够进入方格 (35,37),因为 3+5+3+7=18。但是,它不能进入方格 (35,38),因为 3+5+3+8=19。请问该机器人能够达到多少个格子? ## 解题思路 From 8e88b286d7338c15218fdfa83c35c5d3b8412438 Mon Sep 17 00:00:00 2001 From: cbwleft Date: Sun, 25 Nov 2018 20:01:04 +0800 Subject: [PATCH 28/55] =?UTF-8?q?Update=20=E5=88=86=E5=B8=83=E5=BC=8F.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- notes/分布式.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/notes/分布式.md b/notes/分布式.md index 8c2adf87..e829eb63 100644 --- a/notes/分布式.md +++ b/notes/分布式.md @@ -252,7 +252,7 @@ ACID 要求强一致性,通常运用在传统的数据库系统上。而 BASE Proposer A 接收到两个 Prepare 响应之后,就发送 [n=2, v=8] Accept 请求。该 Accept 请求会被所有 Acceptor 丢弃,因为此时所有 Acceptor 都保证不接受序号小于 4 的提议。 -Proposer B 过后也收到了两个 Prepare 响应,因此也开始发送 Accept 请求。需要注意的是,Accept 请求的 v 需要取它收到的最大 v 值,也就是 8。因此它发送 [n=4, v=8] 的 Accept 请求。 +Proposer B 过后也收到了两个 Prepare 响应,因此也开始发送 Accept 请求。需要注意的是,Accept 请求的 v 需要取它收到的最大提议编号对应的 v 值,也就是 8。因此它发送 [n=4, v=8] 的 Accept 请求。

From 9baeaf648c6f0d103a59f86c0b3f06a9e4799024 Mon Sep 17 00:00:00 2001 From: CyC2018 <1029579233@qq.com> Date: Tue, 27 Nov 2018 01:21:32 +0800 Subject: [PATCH 29/55] auto commit --- notes/Git.md | 2 +- notes/剑指 offer 题解.md | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/notes/Git.md b/notes/Git.md index d1d4c281..4d4cbb2b 100644 --- a/notes/Git.md +++ b/notes/Git.md @@ -90,7 +90,7 @@ Creating a new branch is quick AND simple. # Fast forward -"快进式合并"(fast-forward merge),会直接将 master 分支指向合并的分支,这种模式下进行分支合并会丢失分支信息,也就不能在分支历史上看出分支信息。 +"快进式合并"(fast-farward merge),会直接将 master 分支指向合并的分支,这种模式下进行分支合并会丢失分支信息,也就不能在分支历史上看出分支信息。 可以在合并时加上 --no-ff 参数来禁用 Fast forward 模式,并且加上 -m 参数让合并时产生一个新的 commit。 diff --git a/notes/剑指 offer 题解.md b/notes/剑指 offer 题解.md index c8711c97..ac1e66f6 100644 --- a/notes/剑指 offer 题解.md +++ b/notes/剑指 offer 题解.md @@ -724,7 +724,7 @@ private char[][] buildMatrix(char[] array) { 地上有一个 m 行和 n 列的方格。一个机器人从坐标 (0, 0) 的格子开始移动,每一次只能向左右上下四个方向移动一格,但是不能进入行坐标和列坐标的数位之和大于 k 的格子。 -例如,当 k 为 18 时,机器人能够进入方格 (35,37),因为 3+5+3+7=18。但是,它不能进入方格 (35,38),因为 3+5+3+8=19。请问该机器人能够达到多少个格子? +例如,当 k 为 18 时,机器人能够进入方格 (35,37),因为 3+5+3+7=18。但是,它不能进入方格 (35,37),因为 3+5+3+8=19。请问该机器人能够达到多少个格子? ## 解题思路 @@ -1160,7 +1160,7 @@ public ListNode FindKthToTail(ListNode head, int k) { 在相遇点,slow 要到环的入口点还需要移动 z 个节点,如果让 fast 重新从头开始移动,并且速度变为每次移动一个节点,那么它到环入口点还需要移动 x 个节点。在上面已经推导出 x=z,因此 fast 和 slow 将在环入口点相遇。 -

+

```java public ListNode EntryNodeOfLoop(ListNode pHead) { From 0670f627ab530d5c8f974eef4eb1830f870c5560 Mon Sep 17 00:00:00 2001 From: CyC2018 <1029579233@qq.com> Date: Tue, 27 Nov 2018 01:24:39 +0800 Subject: [PATCH 30/55] auto commit --- notes/剑指 offer 题解.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/notes/剑指 offer 题解.md b/notes/剑指 offer 题解.md index ac1e66f6..fbd0f07a 100644 --- a/notes/剑指 offer 题解.md +++ b/notes/剑指 offer 题解.md @@ -724,7 +724,7 @@ private char[][] buildMatrix(char[] array) { 地上有一个 m 行和 n 列的方格。一个机器人从坐标 (0, 0) 的格子开始移动,每一次只能向左右上下四个方向移动一格,但是不能进入行坐标和列坐标的数位之和大于 k 的格子。 -例如,当 k 为 18 时,机器人能够进入方格 (35,37),因为 3+5+3+7=18。但是,它不能进入方格 (35,37),因为 3+5+3+8=19。请问该机器人能够达到多少个格子? +例如,当 k 为 18 时,机器人能够进入方格 (35,37),因为 3+5+3+7=18。但是,它不能进入方格 (35,38),因为 3+5+3+8=19。请问该机器人能够达到多少个格子? ## 解题思路 From d299d0db2268f7805d5c4b3bd323bc3ba6dee0d3 Mon Sep 17 00:00:00 2001 From: q147258134 <25542139+q147258134@users.noreply.github.com> Date: Wed, 28 Nov 2018 16:18:03 +0800 Subject: [PATCH 31/55] Update Java IO.md MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 指明UTF-16是使用在内存编码中而不是网络编码中,更清楚地表明双字节编码的作用 --- notes/Java IO.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/notes/Java IO.md b/notes/Java IO.md index 105991a8..98ce2fa3 100644 --- a/notes/Java IO.md +++ b/notes/Java IO.md @@ -120,7 +120,7 @@ DataInputStream 装饰者提供了对更多数据类型进行输入的操作, UTF-16be 中的 be 指的是 Big Endian,也就是大端。相应地也有 UTF-16le,le 指的是 Little Endian,也就是小端。 -Java 使用双字节编码 UTF-16be,这不是指 Java 只支持这一种编码方式,而是说 char 这种类型使用 UTF-16be 进行编码。char 类型占 16 位,也就是两个字节,Java 使用这种双字节编码是为了让一个中文或者一个英文都能使用一个 char 来存储。 +Java 的内存编码使用双字节编码 UTF-16be,这不是指 Java 只支持这一种编码方式,而是说 char 这种类型使用 UTF-16be 进行编码。char 类型占 16 位,也就是两个字节,Java 使用这种双字节编码是为了让一个中文或者一个英文都能使用一个 char 来存储。 ## String 的编码方式 From 1bf31249a092b88ef09cd979f3ff51053d4ef21e Mon Sep 17 00:00:00 2001 From: q147258134 <25542139+q147258134@users.noreply.github.com> Date: Wed, 28 Nov 2018 16:23:20 +0800 Subject: [PATCH 32/55] Update Java IO.md --- notes/Java IO.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/notes/Java IO.md b/notes/Java IO.md index 98ce2fa3..dfbe4c2e 100644 --- a/notes/Java IO.md +++ b/notes/Java IO.md @@ -44,7 +44,7 @@ Java 的 I/O 大概可以分成以下几类: # 二、磁盘操作 -File 类可以用于表示文件和目录的信息,但是它不表示文件的内容。 +File 类可以用于表示文件和目录的信息,但是它不表示文件的内容。(已被Java7的Path类代替) 递归地列出一个目录下所有文件: From bd33a1bd7067021350e0cea2f760775f5e35ae04 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=83=91=E6=B0=B8=E5=B7=9D?= Date: Wed, 28 Nov 2018 16:29:57 +0800 Subject: [PATCH 33/55] Update Java IO.md --- notes/Java IO.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/notes/Java IO.md b/notes/Java IO.md index dfbe4c2e..1b857bc7 100644 --- a/notes/Java IO.md +++ b/notes/Java IO.md @@ -44,7 +44,7 @@ Java 的 I/O 大概可以分成以下几类: # 二、磁盘操作 -File 类可以用于表示文件和目录的信息,但是它不表示文件的内容。(已被Java7的Path类代替) +File 类可以用于表示文件和目录的信息,但是它不表示文件的内容。 递归地列出一个目录下所有文件: @@ -63,6 +63,8 @@ public static void listAllFiles(File dir) { } ``` +从 Java7 开始,可以使用 Paths 和 Files 代替 File。 + # 三、字节操作 ## 实现文件复制 From 96ac96c79a3b4a697a37db0735039cf9f504cb07 Mon Sep 17 00:00:00 2001 From: OOC Date: Thu, 29 Nov 2018 14:40:03 +0800 Subject: [PATCH 34/55] =?UTF-8?q?Update=20Java=20=E5=AE=B9=E5=99=A8.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- notes/Java 容器.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/notes/Java 容器.md b/notes/Java 容器.md index 1db0d845..305ca924 100644 --- a/notes/Java 容器.md +++ b/notes/Java 容器.md @@ -727,7 +727,7 @@ new capacity : 00100000 对于一个 Key, -- 它的哈希值如果在第 6 位上为 0,那么取模得到的结果和之前一样; +- 它的哈希值如果在第 5 位上为 0,那么取模得到的结果和之前一样; - 如果为 1,那么得到的结果为原来的结果 +16。 ### 7. 计算数组容量 From 653c144f9a658d7b0d72d6117e81a813ebfe5116 Mon Sep 17 00:00:00 2001 From: q147258134 <25542139+q147258134@users.noreply.github.com> Date: Thu, 29 Nov 2018 14:50:34 +0800 Subject: [PATCH 35/55] =?UTF-8?q?Update=20Java=20=E5=9F=BA=E7=A1=80.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 翻译了反射的优缺点 --- notes/Java 基础.md | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/notes/Java 基础.md b/notes/Java 基础.md index 1cf3222a..00762e85 100644 --- a/notes/Java 基础.md +++ b/notes/Java 基础.md @@ -1209,19 +1209,19 @@ Class 和 java.lang.reflect 一起对反射提供了支持,java.lang.reflect - **Method** :可以使用 invoke() 方法调用与 Method 对象关联的方法; - **Constructor** :可以用 Constructor 创建新的对象。 -**Advantages of Using Reflection:** +**反射的优点:** +- **可扩展性** :应用程序可以利用全限定名创建可扩展对象的实例,来使用来自外部的用户自定义类。 +- **类浏览器和可视化开发环境** :一个类浏览器需要可以枚举类的成员。可视化开发环境(如IDE)可以从利用反射中可用的类型信息中受益,以帮助程序员编写正确的代码。 +- **调试器和测试工具** : 调试器需要能够检查一个类里的私有成员。测试工具可以利用反射来自动地调用类里定义的可被发现的API定义,以确保一组测试中有较高的代码覆盖率。 -- **Extensibility Features** : An application may make use of external, user-defined classes by creating instances of extensibility objects using their fully-qualified names. -- **Class Browsers and Visual Development Environments** : A class browser needs to be able to enumerate the members of classes. Visual development environments can benefit from making use of type information available in reflection to aid the developer in writing correct code. -- **Debuggers and Test Tools** : Debuggers need to be able to examine private members on classes. Test harnesses can make use of reflection to systematically call a discoverable set APIs defined on a class, to insure a high level of code coverage in a test suite. -**Drawbacks of Reflection:** +**反射的缺点:** -Reflection is powerful, but should not be used indiscriminately. If it is possible to perform an operation without using reflection, then it is preferable to avoid using it. The following concerns should be kept in mind when accessing code via reflection. +尽管反射非常强大,但也不能滥用。如果一个功能可以不用反射完成,那么最好就不用。在我们使用反射技术时,下面几条内容应该牢记于心。 -- **Performance Overhead** : Because reflection involves types that are dynamically resolved, certain Java virtual machine optimizations can not be performed. Consequently, reflective operations have slower performance than their non-reflective counterparts, and should be avoided in sections of code which are called frequently in performance-sensitive applications. -- **Security Restrictions** : Reflection requires a runtime permission which may not be present when running under a security manager. This is in an important consideration for code which has to run in a restricted security context, such as in an Applet. -- **Exposure of Internals** :Since reflection allows code to perform operations that would be illegal in non-reflective code, such as accessing private fields and methods, the use of reflection can result in unexpected side-effects, which may render code dysfunctional and may destroy portability. Reflective code breaks abstractions and therefore may change behavior with upgrades of the platform. +- **性能开销** :反射涉及了动态类型的解析,所以JVM无法对这些代码进行优化。因此,反射操作的效率要比那些非反射操作低得多。我们应该避免在经常被执行的代码或对性能要求很高的程序中使用反射。 +- **安全限制** :使用反射技术要求程序必须在一个没有安全限制的环境中运行。如果一个程序必须在有安全限制的环境中运行,如Applet,那么这就是个问题了。 +- **内部暴露** :由于反射允许代码执行一些在正常情况下不被允许的操作(比如访问私有的属性和方法),所以使用反射可能会导致意料之外的副作用,这可能导致代码功能失调并破坏可移植性。反射代码破坏了抽象性,因此当平台发生改变的时候,代码的行为就有可能也随着变化。 - [Trail: The Reflection API](https://docs.oracle.com/javase/tutorial/reflect/index.html) From 5cf8bc133da0fd7670db068ed244caec98bff438 Mon Sep 17 00:00:00 2001 From: PansonPanson Date: Sun, 2 Dec 2018 18:54:22 +0800 Subject: [PATCH 36/55] misspelled: IllegalMonitorStateExeception TO IllegalMonitorStateException --- notes/Java 并发.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/notes/Java 并发.md b/notes/Java 并发.md index cc2c28a9..024f6636 100644 --- a/notes/Java 并发.md +++ b/notes/Java 并发.md @@ -632,7 +632,7 @@ B 它们都属于 Object 的一部分,而不属于 Thread。 -只能用在同步方法或者同步控制块中使用,否则会在运行时抛出 IllegalMonitorStateExeception。 +只能用在同步方法或者同步控制块中使用,否则会在运行时抛出 IllegalMonitorStateException。 使用 wait() 挂起期间,线程会释放锁。这是因为,如果没有释放锁,那么其它线程就无法进入对象的同步方法或者同步控制块中,那么就无法执行 notify() 或者 notifyAll() 来唤醒挂起的线程,造成死锁。 From 872f9aa5fd2dd19f35700227bed0c0e2a513d99c Mon Sep 17 00:00:00 2001 From: PansonPanson Date: Sun, 2 Dec 2018 23:44:45 +0800 Subject: [PATCH 37/55] =?UTF-8?q?=E4=BB=A3=E7=A0=81=E8=A7=84=E8=8C=83?= =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E9=98=BF=E9=87=8C=E5=B7=B4=E5=B7=B4Java?= =?UTF-8?q?=E5=BC=80=E5=8F=91=E6=89=8B=E5=86=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- notes/代码风格规范.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/notes/代码风格规范.md b/notes/代码风格规范.md index dedada7d..60812070 100644 --- a/notes/代码风格规范.md +++ b/notes/代码风格规范.md @@ -4,3 +4,5 @@ - [Twitter Java Style Guide](https://github.com/twitter/commons/blob/master/src/java/com/twitter/common/styleguide.md) - [Google Java Style Guide](http://google.github.io/styleguide/javaguide.html) +- [阿里巴巴Java开发手册](https://github.com/alibaba/p3c/blob/master/%E9%98%BF%E9%87%8C%E5%B7%B4%E5%B7%B4Java%E5%BC%80%E5%8F%91%E6%89%8B%E5%86%8C%EF%BC%88%E8%AF%A6%E5%B0%BD%E7%89%88%EF%BC%89.pdf) + From 824cf69b34415d9854c85ed563072e42597a47c8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=83=91=E6=B0=B8=E5=B7=9D?= Date: Mon, 3 Dec 2018 16:34:36 +0800 Subject: [PATCH 38/55] auto commit --- notes/代码风格规范.md | 1 + 1 file changed, 1 insertion(+) diff --git a/notes/代码风格规范.md b/notes/代码风格规范.md index 60812070..c3d462af 100644 --- a/notes/代码风格规范.md +++ b/notes/代码风格规范.md @@ -6,3 +6,4 @@ - [Google Java Style Guide](http://google.github.io/styleguide/javaguide.html) - [阿里巴巴Java开发手册](https://github.com/alibaba/p3c/blob/master/%E9%98%BF%E9%87%8C%E5%B7%B4%E5%B7%B4Java%E5%BC%80%E5%8F%91%E6%89%8B%E5%86%8C%EF%BC%88%E8%AF%A6%E5%B0%BD%E7%89%88%EF%BC%89.pdf) + From f39233e9ebd4fe05568615edd58a15f4b0352b62 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=83=91=E6=B0=B8=E5=B7=9D?= Date: Mon, 3 Dec 2018 16:35:01 +0800 Subject: [PATCH 39/55] auto commit --- 2018 这一年.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/2018 这一年.md b/2018 这一年.md index ed3337b0..b8efeac0 100644 --- a/2018 这一年.md +++ b/2018 这一年.md @@ -1,4 +1,4 @@ -作者:CyC2018 +作者:CyC2018 链接:https://www.nowcoder.com/discuss/137593 @@ -136,4 +136,4 @@ 信心源自于充分准备,有了信心,面试的时候才能游刃有余。而毫无依据的自我感觉良好,在每次失败之后都看不到自身的不足,而是怪罪于外界因素。 -做好自己的简历,我在简历上花了很长时间,只要允许,我都会用这个简历给面试官演示:[个人简历](https://cyc2018.github.io)。 \ No newline at end of file +做好自己的简历,我在简历上花了很长时间,只要允许,我都会用这个简历给面试官演示:[个人简历](https://cyc2018.github.io)。 From d7c1ee500aa7427d26309febac01fc0b34cbee27 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=83=91=E6=B0=B8=E5=B7=9D?= Date: Mon, 3 Dec 2018 16:35:21 +0800 Subject: [PATCH 40/55] Update Group.md --- other/Group.md | 1 + 1 file changed, 1 insertion(+) diff --git a/other/Group.md b/other/Group.md index d56339d7..5972dd60 100644 --- a/other/Group.md +++ b/other/Group.md @@ -11,3 +11,4 @@ 交流群不讨论政治,不讨论有争议性的话题,不发表仇视言论,不传播谣言,不发布广告(招聘信息之类的可以)。

+ From cbeea9b578beef4d8ae2a67ddda6273283e1ac8e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=83=91=E6=B0=B8=E5=B7=9D?= Date: Mon, 3 Dec 2018 16:35:32 +0800 Subject: [PATCH 41/55] auto commit From f592b7e69e4bca099bee076a9b67d1249f44a95b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=83=91=E6=B0=B8=E5=B7=9D?= Date: Mon, 3 Dec 2018 16:35:57 +0800 Subject: [PATCH 42/55] auto commit --- other/Group.md | 1 + 1 file changed, 1 insertion(+) diff --git a/other/Group.md b/other/Group.md index 5972dd60..5b9fc777 100644 --- a/other/Group.md +++ b/other/Group.md @@ -12,3 +12,4 @@

+ From c6abd22b45d71124fa23814b0e89e3a76cbabd0f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=83=91=E6=B0=B8=E5=B7=9D?= Date: Mon, 3 Dec 2018 16:36:13 +0800 Subject: [PATCH 43/55] auto commit --- BOOKLIST.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/BOOKLIST.md b/BOOKLIST.md index e88ba706..1e7fb040 100644 --- a/BOOKLIST.md +++ b/BOOKLIST.md @@ -1,4 +1,4 @@ -# 数据结构与算法 +# 数据结构与算法 - [算法](https://book.douban.com/subject/19952400/) - [数据结构与算法分析](https://book.douban.com/subject/3351237/) From 5e8252f58428ed4615ef3e54796893d8a9cc937c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=83=91=E6=B0=B8=E5=B7=9D?= Date: Mon, 3 Dec 2018 16:36:35 +0800 Subject: [PATCH 44/55] auto commit --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 51a55682..471c4dc4 100644 --- a/README.md +++ b/README.md @@ -8,7 +8,7 @@
- + ### :pencil2: 算法 From f976c3b88278ebd96b23539d6c54af811cee49a4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=83=91=E6=B0=B8=E5=B7=9D?= Date: Mon, 3 Dec 2018 16:36:52 +0800 Subject: [PATCH 45/55] auto commit --- SUMMARY.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SUMMARY.md b/SUMMARY.md index a864c37f..216e3d78 100644 --- a/SUMMARY.md +++ b/SUMMARY.md @@ -1,4 +1,4 @@ -This file used to generate gitbook catalogue. +This file used to generate gitbook catalogue. # Summary From c27511a3347296a02eb1d0aa5c090c8ca5a2addd Mon Sep 17 00:00:00 2001 From: tianyongwei <869358189@qq.com> Date: Tue, 4 Dec 2018 11:06:01 +0800 Subject: [PATCH 46/55] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E3=80=8A=E6=B7=B1?= =?UTF-8?q?=E5=85=A5Java=E8=99=9A=E6=8B=9F=E6=9C=BA=E3=80=8B=E2=80=94?= =?UTF-8?q?=E2=80=94=E4=B8=8D=E5=90=8C=E4=BA=8E=E3=80=8A=E6=B7=B1=E5=85=A5?= =?UTF-8?q?=E7=90=86=E8=A7=A3Java=E8=99=9A=E6=8B=9F=E6=9C=BA=E3=80=8B?= =?UTF-8?q?=EF=BC=8C=E5=86=85=E5=AE=B9=E5=BE=88=E6=A3=92=EF=BC=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- BOOKLIST.md | 1 + 1 file changed, 1 insertion(+) diff --git a/BOOKLIST.md b/BOOKLIST.md index 1e7fb040..cbcf8ab0 100644 --- a/BOOKLIST.md +++ b/BOOKLIST.md @@ -41,6 +41,7 @@ - [Java 编程思想](https://book.douban.com/subject/2130190/) - [Effective java 中文版](https://book.douban.com/subject/3360807/) +- [深入Java虚拟机(原书第2版)](https://book.douban.com/subject/1138768/) - [深入理解 Java 虚拟机](https://book.douban.com/subject/24722612/) - [Java 并发编程实战](https://book.douban.com/subject/10484692/) - [精通 Spring 4.x](https://book.douban.com/subject/26952826/) From 928e8d3cc8aecdfafda096354200274232f9625c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=83=91=E6=B0=B8=E5=B7=9D?= Date: Tue, 4 Dec 2018 12:30:14 +0800 Subject: [PATCH 47/55] auto commit --- BOOKLIST.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/BOOKLIST.md b/BOOKLIST.md index cbcf8ab0..1cd7b066 100644 --- a/BOOKLIST.md +++ b/BOOKLIST.md @@ -1,5 +1,5 @@ # 数据结构与算法 - + - [算法](https://book.douban.com/subject/19952400/) - [数据结构与算法分析](https://book.douban.com/subject/3351237/) - [编程珠玑](https://book.douban.com/subject/3227098/) From 46e30212229b469fbcc5af28ef45b0a6c46a0d10 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=83=91=E6=B0=B8=E5=B7=9D?= Date: Wed, 5 Dec 2018 10:57:33 +0800 Subject: [PATCH 48/55] auto commit --- notes/算法.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/notes/算法.md b/notes/算法.md index d6e21d6a..777e3ecd 100644 --- a/notes/算法.md +++ b/notes/算法.md @@ -541,7 +541,7 @@ public class QuickSort> extends Sort { ### 2. 切分 -取 a[l] 作为切分元素,然后从数组的左端向右扫描直到找到第一个大于等于它的元素,再从数组的右端向左扫描找到第一个小于等于它的元素,交换这两个元素。不断进行这个过程,就可以保证左指针 i 的左侧元素都不大于切分元素,右指针 j 的右侧元素都不小于切分元素。当两个指针相遇时,将切分元素 a[l] 和 a[j] 交换位置。 +取 a[l] 作为切分元素,然后从数组的左端向右扫描直到找到第一个大于等于它的元素,再从数组的右端向左扫描找到第一个小于它的元素,交换这两个元素。不断进行这个过程,就可以保证左指针 i 的左侧元素都不大于切分元素,右指针 j 的右侧元素都不小于切分元素。当两个指针相遇时,将切分元素 a[l] 和 a[j] 交换位置。

From 9e9c7faadf6af81e629b49f0fd3050a04acefa5c Mon Sep 17 00:00:00 2001 From: LuoJianPing <812184246@qq.com> Date: Sat, 8 Dec 2018 11:28:02 +0800 Subject: [PATCH 49/55] =?UTF-8?q?Update=20=E5=89=91=E6=8C=87=20offer=20?= =?UTF-8?q?=E9=A2=98=E8=A7=A3.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- notes/剑指 offer 题解.md | 49 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 49 insertions(+) diff --git a/notes/剑指 offer 题解.md b/notes/剑指 offer 题解.md index fbd0f07a..75396665 100644 --- a/notes/剑指 offer 题解.md +++ b/notes/剑指 offer 题解.md @@ -2826,6 +2826,55 @@ public int LastRemaining_Solution(int n, int m) { return (LastRemaining_Solution(n - 1, m) + m) % n; } ``` +## 解题思路详解 +创新的解法,采用数学公式推导找到规律,推导过程如下: + +Step1. +首先定义一个关于 m 和 n 的函数:f(n, m),表示在n个数字 0,1,2…,n-1 中每次删除第m个数字,最后剩下的那个数字。 +  注意:f(n, m)表示的是,在经过了多次删除后,最后剩下的那个数字,也就是说f(n,m)本质上是个数。 + +Step2. +n个数中,第一个被删除的数是(m - 1) % n,把它记为k,此时数组中还剩下0,1,2… k-1, k+1,…n-1 这几个数字。接下来从k+1开始计数,相当于在剩下的序列中,k+1排在最前面,从而形成k+1,… n-1,… 0,1,2…k-1。本题中,第一个被删除的是数字2,因此数组还剩下 0,1,3,4,5,相当于3,4,5,0,1。由于这个序列是不连续的,在2那个地方断开了,所以不能写为f(n-1, m)。在此记为g(n-1, m)。 +最初序列最后剩下的数字,一定是删除一个数字后剩下的数字,因此f(n, m) = g(n-1, m) + +Step3. +将[3,4,5,0,1]重新映射为[0,1,2,3,4],映射的公式是:p(x) = (x - k - 1) % n。其中k = 2,n = 6。 +  3 —-> 0 +  4 —-> 1 +  5 —-> 2 +  0 —-> 3 +  1 —-> 4 +映射以后的序列是0,1,2,3,4,是一个连续的序列,因此可以用f(n-1, m)来表示。 +此时的f(n-1, m)是不等于g(n-1, m),因为二者对应的序列不同,存在一个映射关系。 +该映射的逆映射是 p’(x) = (x + k + 1) % n +因此g(n-1, m) = p’[f(n-1, m)] = [f(n-1, m) + k + 1] % n +即:f(n, m) = [f(n-1, m) + k + 1] % n +带入k = (m - 1) % n, 得到f(n, m) = [f(n-1, m) +m] % n (n > 1) + +Step4. +当n = 1时,只有一个人,此时剩余的数字为0 + +综上,约瑟夫环的公式是: +f(n, m) = 0           (n = 1) +f(n, m) = [f(n-1, m) +m] % n  (n > 1) + +```java +public class Solution { + + public int LastRemaining_Solution(int n, int m) { + // 不合法输入的判断 + if(n == 0 || m < 1) { + return -1; + } + int last = 0; + for(int i = 2; i <= n; i++) { + last = (last + m) % i; + } + return last; + } + +} +``` # 63. 股票的最大利润 From 0fec89597782b27192c8e5c452f3a13334e1ddd6 Mon Sep 17 00:00:00 2001 From: SH5511 <2585649789@qq.com> Date: Sat, 8 Dec 2018 14:18:20 +0800 Subject: [PATCH 50/55] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E6=8F=8F=E8=BF=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- notes/Java 容器.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/notes/Java 容器.md b/notes/Java 容器.md index 305ca924..dbd41edc 100644 --- a/notes/Java 容器.md +++ b/notes/Java 容器.md @@ -68,7 +68,7 @@

-Collection 实现了 Iterable 接口,其中的 iterator() 方法能够产生一个 Iterator 对象,通过这个对象就可以迭代遍历 Collection 中的元素。 +Collection 继承了 Iterable 接口,其中的 iterator() 方法能够产生一个 Iterator 对象,通过这个对象就可以迭代遍历 Collection 中的元素。 从 JDK 1.5 之后可以使用 foreach 方法来遍历实现了 Iterable 接口的聚合对象。 From 1a478a905fc8b8af95b7eda50bb3d47150d2093b Mon Sep 17 00:00:00 2001 From: CyC2018 <1029579233@qq.com> Date: Sat, 8 Dec 2018 16:10:36 +0800 Subject: [PATCH 51/55] auto commit --- notes/Java IO.md | 2 +- notes/Java 基础.md | 18 ++++++++------- notes/Java 并发.md | 2 +- notes/代码风格规范.md | 3 --- notes/剑指 offer 题解.md | 49 ---------------------------------------- 5 files changed, 12 insertions(+), 62 deletions(-) diff --git a/notes/Java IO.md b/notes/Java IO.md index 1b857bc7..76984d94 100644 --- a/notes/Java IO.md +++ b/notes/Java IO.md @@ -122,7 +122,7 @@ DataInputStream 装饰者提供了对更多数据类型进行输入的操作, UTF-16be 中的 be 指的是 Big Endian,也就是大端。相应地也有 UTF-16le,le 指的是 Little Endian,也就是小端。 -Java 的内存编码使用双字节编码 UTF-16be,这不是指 Java 只支持这一种编码方式,而是说 char 这种类型使用 UTF-16be 进行编码。char 类型占 16 位,也就是两个字节,Java 使用这种双字节编码是为了让一个中文或者一个英文都能使用一个 char 来存储。 +Java 使用双字节编码 UTF-16be,这不是指 Java 只支持这一种编码方式,而是说 char 这种类型使用 UTF-16be 进行编码。char 类型占 16 位,也就是两个字节,Java 使用这种双字节编码是为了让一个中文或者一个英文都能使用一个 char 来存储。 ## String 的编码方式 diff --git a/notes/Java 基础.md b/notes/Java 基础.md index 00762e85..6707cc28 100644 --- a/notes/Java 基础.md +++ b/notes/Java 基础.md @@ -1209,19 +1209,21 @@ Class 和 java.lang.reflect 一起对反射提供了支持,java.lang.reflect - **Method** :可以使用 invoke() 方法调用与 Method 对象关联的方法; - **Constructor** :可以用 Constructor 创建新的对象。 -**反射的优点:** -- **可扩展性** :应用程序可以利用全限定名创建可扩展对象的实例,来使用来自外部的用户自定义类。 -- **类浏览器和可视化开发环境** :一个类浏览器需要可以枚举类的成员。可视化开发环境(如IDE)可以从利用反射中可用的类型信息中受益,以帮助程序员编写正确的代码。 -- **调试器和测试工具** : 调试器需要能够检查一个类里的私有成员。测试工具可以利用反射来自动地调用类里定义的可被发现的API定义,以确保一组测试中有较高的代码覆盖率。 +**反射的优点:** +* **可扩展性** :应用程序可以利用全限定名创建可扩展对象的实例,来使用来自外部的用户自定义类。 +* **类浏览器和可视化开发环境** :一个类浏览器需要可以枚举类的成员。可视化开发环境(如 IDE)可以从利用反射中可用的类型信息中受益,以帮助程序员编写正确的代码。 +* **调试器和测试工具** : 调试器需要能够检查一个类里的私有成员。测试工具可以利用反射来自动地调用类里定义的可被发现的 API 定义,以确保一组测试中有较高的代码覆盖率。 -**反射的缺点:** +**反射的缺点:** 尽管反射非常强大,但也不能滥用。如果一个功能可以不用反射完成,那么最好就不用。在我们使用反射技术时,下面几条内容应该牢记于心。 -- **性能开销** :反射涉及了动态类型的解析,所以JVM无法对这些代码进行优化。因此,反射操作的效率要比那些非反射操作低得多。我们应该避免在经常被执行的代码或对性能要求很高的程序中使用反射。 -- **安全限制** :使用反射技术要求程序必须在一个没有安全限制的环境中运行。如果一个程序必须在有安全限制的环境中运行,如Applet,那么这就是个问题了。 -- **内部暴露** :由于反射允许代码执行一些在正常情况下不被允许的操作(比如访问私有的属性和方法),所以使用反射可能会导致意料之外的副作用,这可能导致代码功能失调并破坏可移植性。反射代码破坏了抽象性,因此当平台发生改变的时候,代码的行为就有可能也随着变化。 +* **性能开销** :反射涉及了动态类型的解析,所以 JVM 无法对这些代码进行优化。因此,反射操作的效率要比那些非反射操作低得多。我们应该避免在经常被执行的代码或对性能要求很高的程序中使用反射。 + +* **安全限制** :使用反射技术要求程序必须在一个没有安全限制的环境中运行。如果一个程序必须在有安全限制的环境中运行,如 Applet,那么这就是个问题了。 + +* **内部暴露** :由于反射允许代码执行一些在正常情况下不被允许的操作(比如访问私有的属性和方法),所以使用反射可能会导致意料之外的副作用,这可能导致代码功能失调并破坏可移植性。反射代码破坏了抽象性,因此当平台发生改变的时候,代码的行为就有可能也随着变化。 - [Trail: The Reflection API](https://docs.oracle.com/javase/tutorial/reflect/index.html) diff --git a/notes/Java 并发.md b/notes/Java 并发.md index 024f6636..cc2c28a9 100644 --- a/notes/Java 并发.md +++ b/notes/Java 并发.md @@ -632,7 +632,7 @@ B 它们都属于 Object 的一部分,而不属于 Thread。 -只能用在同步方法或者同步控制块中使用,否则会在运行时抛出 IllegalMonitorStateException。 +只能用在同步方法或者同步控制块中使用,否则会在运行时抛出 IllegalMonitorStateExeception。 使用 wait() 挂起期间,线程会释放锁。这是因为,如果没有释放锁,那么其它线程就无法进入对象的同步方法或者同步控制块中,那么就无法执行 notify() 或者 notifyAll() 来唤醒挂起的线程,造成死锁。 diff --git a/notes/代码风格规范.md b/notes/代码风格规范.md index c3d462af..dedada7d 100644 --- a/notes/代码风格规范.md +++ b/notes/代码风格规范.md @@ -4,6 +4,3 @@ - [Twitter Java Style Guide](https://github.com/twitter/commons/blob/master/src/java/com/twitter/common/styleguide.md) - [Google Java Style Guide](http://google.github.io/styleguide/javaguide.html) -- [阿里巴巴Java开发手册](https://github.com/alibaba/p3c/blob/master/%E9%98%BF%E9%87%8C%E5%B7%B4%E5%B7%B4Java%E5%BC%80%E5%8F%91%E6%89%8B%E5%86%8C%EF%BC%88%E8%AF%A6%E5%B0%BD%E7%89%88%EF%BC%89.pdf) - - diff --git a/notes/剑指 offer 题解.md b/notes/剑指 offer 题解.md index 75396665..fbd0f07a 100644 --- a/notes/剑指 offer 题解.md +++ b/notes/剑指 offer 题解.md @@ -2826,55 +2826,6 @@ public int LastRemaining_Solution(int n, int m) { return (LastRemaining_Solution(n - 1, m) + m) % n; } ``` -## 解题思路详解 -创新的解法,采用数学公式推导找到规律,推导过程如下: - -Step1. -首先定义一个关于 m 和 n 的函数:f(n, m),表示在n个数字 0,1,2…,n-1 中每次删除第m个数字,最后剩下的那个数字。 -  注意:f(n, m)表示的是,在经过了多次删除后,最后剩下的那个数字,也就是说f(n,m)本质上是个数。 - -Step2. -n个数中,第一个被删除的数是(m - 1) % n,把它记为k,此时数组中还剩下0,1,2… k-1, k+1,…n-1 这几个数字。接下来从k+1开始计数,相当于在剩下的序列中,k+1排在最前面,从而形成k+1,… n-1,… 0,1,2…k-1。本题中,第一个被删除的是数字2,因此数组还剩下 0,1,3,4,5,相当于3,4,5,0,1。由于这个序列是不连续的,在2那个地方断开了,所以不能写为f(n-1, m)。在此记为g(n-1, m)。 -最初序列最后剩下的数字,一定是删除一个数字后剩下的数字,因此f(n, m) = g(n-1, m) - -Step3. -将[3,4,5,0,1]重新映射为[0,1,2,3,4],映射的公式是:p(x) = (x - k - 1) % n。其中k = 2,n = 6。 -  3 —-> 0 -  4 —-> 1 -  5 —-> 2 -  0 —-> 3 -  1 —-> 4 -映射以后的序列是0,1,2,3,4,是一个连续的序列,因此可以用f(n-1, m)来表示。 -此时的f(n-1, m)是不等于g(n-1, m),因为二者对应的序列不同,存在一个映射关系。 -该映射的逆映射是 p’(x) = (x + k + 1) % n -因此g(n-1, m) = p’[f(n-1, m)] = [f(n-1, m) + k + 1] % n -即:f(n, m) = [f(n-1, m) + k + 1] % n -带入k = (m - 1) % n, 得到f(n, m) = [f(n-1, m) +m] % n (n > 1) - -Step4. -当n = 1时,只有一个人,此时剩余的数字为0 - -综上,约瑟夫环的公式是: -f(n, m) = 0           (n = 1) -f(n, m) = [f(n-1, m) +m] % n  (n > 1) - -```java -public class Solution { - - public int LastRemaining_Solution(int n, int m) { - // 不合法输入的判断 - if(n == 0 || m < 1) { - return -1; - } - int last = 0; - for(int i = 2; i <= n; i++) { - last = (last + m) % i; - } - return last; - } - -} -``` # 63. 股票的最大利润 From b4c222226d1cb2c1bf227e18783297050ab9a4ea Mon Sep 17 00:00:00 2001 From: CyC2018 <1029579233@qq.com> Date: Sat, 8 Dec 2018 16:14:15 +0800 Subject: [PATCH 52/55] auto commit --- notes/Java IO.md | 2 +- notes/Java 并发.md | 2 +- notes/代码风格规范.md | 1 + 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/notes/Java IO.md b/notes/Java IO.md index 76984d94..1b857bc7 100644 --- a/notes/Java IO.md +++ b/notes/Java IO.md @@ -122,7 +122,7 @@ DataInputStream 装饰者提供了对更多数据类型进行输入的操作, UTF-16be 中的 be 指的是 Big Endian,也就是大端。相应地也有 UTF-16le,le 指的是 Little Endian,也就是小端。 -Java 使用双字节编码 UTF-16be,这不是指 Java 只支持这一种编码方式,而是说 char 这种类型使用 UTF-16be 进行编码。char 类型占 16 位,也就是两个字节,Java 使用这种双字节编码是为了让一个中文或者一个英文都能使用一个 char 来存储。 +Java 的内存编码使用双字节编码 UTF-16be,这不是指 Java 只支持这一种编码方式,而是说 char 这种类型使用 UTF-16be 进行编码。char 类型占 16 位,也就是两个字节,Java 使用这种双字节编码是为了让一个中文或者一个英文都能使用一个 char 来存储。 ## String 的编码方式 diff --git a/notes/Java 并发.md b/notes/Java 并发.md index cc2c28a9..024f6636 100644 --- a/notes/Java 并发.md +++ b/notes/Java 并发.md @@ -632,7 +632,7 @@ B 它们都属于 Object 的一部分,而不属于 Thread。 -只能用在同步方法或者同步控制块中使用,否则会在运行时抛出 IllegalMonitorStateExeception。 +只能用在同步方法或者同步控制块中使用,否则会在运行时抛出 IllegalMonitorStateException。 使用 wait() 挂起期间,线程会释放锁。这是因为,如果没有释放锁,那么其它线程就无法进入对象的同步方法或者同步控制块中,那么就无法执行 notify() 或者 notifyAll() 来唤醒挂起的线程,造成死锁。 diff --git a/notes/代码风格规范.md b/notes/代码风格规范.md index dedada7d..6c9ed1c8 100644 --- a/notes/代码风格规范.md +++ b/notes/代码风格规范.md @@ -4,3 +4,4 @@ - [Twitter Java Style Guide](https://github.com/twitter/commons/blob/master/src/java/com/twitter/common/styleguide.md) - [Google Java Style Guide](http://google.github.io/styleguide/javaguide.html) +- [阿里巴巴Java开发手册](https://github.com/alibaba/p3c/blob/master/%E9%98%BF%E9%87%8C%E5%B7%B4%E5%B7%B4Java%E5%BC%80%E5%8F%91%E6%89%8B%E5%86%8C%EF%BC%88%E8%AF%A6%E5%B0%BD%E7%89%88%EF%BC%89.pdf) From bdfda4d9a8137c4a705a99eeda01ce7ca4427c90 Mon Sep 17 00:00:00 2001 From: yifei-fu Date: Sat, 8 Dec 2018 19:43:30 -0800 Subject: [PATCH 53/55] Fixing typo in README.md. --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 471c4dc4..495e0843 100644 --- a/README.md +++ b/README.md @@ -88,7 +88,7 @@ - [Java 容器](https://github.com/CyC2018/InnterviewNotes/blob/master/notes/Java%20容器.md) - 源码分析:ArrayList、Vector、CopyOnWriteArrayList、LinkedList、HashMap、ConcurrentHashMap、LinkedHashMap、WeekHashMap。 + 源码分析:ArrayList、Vector、CopyOnWriteArrayList、LinkedList、HashMap、ConcurrentHashMap、LinkedHashMap、WeakHashMap。 - [Java 并发](https://github.com/CyC2018/InnterviewNotes/blob/master/notes/Java%20并发.md) From 5186e3cac1c35727e56de9fde4e65940e3a8fb4e Mon Sep 17 00:00:00 2001 From: CyC2018 <1029579233@qq.com> Date: Sun, 9 Dec 2018 18:42:08 +0800 Subject: [PATCH 54/55] auto commit --- Additional.md | 46 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 46 insertions(+) create mode 100644 Additional.md diff --git a/Additional.md b/Additional.md new file mode 100644 index 00000000..9ed7bb4b --- /dev/null +++ b/Additional.md @@ -0,0 +1,46 @@ +# 前言 + +本文档提供博客内容的补充资料,记录一些还没写又很重要的内容。欢迎补充! + +格式:\[资料名称\]\[标签1\]\[标签2\]... + + +# 系统设计 + +- [[system-design-primer][Github]](https://github.com/donnemartin/system-design-primer) +- [[Leetcode / Interview Questions][题集]](https://leetcode.com/discuss/interview-question/?orderBy=most_votes) +- [[系统设计面试题精选][Gitbook]](https://soulmachine.gitbooks.io/system-design/content/cn/) +- [[海量数据面试题]](https://samanthachen.github.io/2016/08/01/%E6%B5%B7%E9%87%8F%E6%95%B0%E6%8D%AE%E9%9D%A2%E8%AF%95%E9%A2%98/) +- [[前端经典面试题: 从输入 URL 到页面加载发生了什么?][具体问题]](https://segmentfault.com/a/1190000006879700) +- [[秒杀系统架构分析与实战][具体问题]](https://my.oschina.net/xianggao/blog/524943) +- [[微信二维码登录原理][具体问题]](https://zhuanlan.zhihu.com/p/22325152?refer=bittiger) +- [[Create a TinyURL System][具体问题]](https://github.com/CyC2018/CS-Notes) +- [[Design a Key-Value Store (Part I)][具体问题]](http://blog.gainlo.co/index.php/2016/06/14/design-a-key-value-store-part-i/) +- [[坦率地讲 服务熔断 & 服务降级][知识点]](http://lexuslee.me/2018/02/01/2018-01-18-Service-fallback/) +- [[理解 HTTP 幂等性][知识点]](https://www.cnblogs.com/weidagang2046/archive/2011/06/04/idempotence.html) +- [[接口限流算法][知识点]](https://blog.csdn.net/ljj821061514/article/details/52512943) +- [[微服务学习资料汇总][知识点]](https://www.infoq.cn/article/2014%2F07%2Fmicroservice-learning-resources) +- [[理解 RESTful 架构][知识点]](http://www.ruanyifeng.com/blog/2011/09/restful.html) +- [[MapReduce 算法][知识点]](https://github.com/xuelangZF/CS_Offer/blob/master/Others/Hadoop_Spark.md) + +# Spring + +- [[Spring 揭秘][书籍]](https://book.douban.com/subject/3897837/) +- [[69 道 Spring 面试题和答案][面试题集锦]](http://ifeve.com/spring-interview-questions-and-answers/) +- [[Spring 面试题][面试题集锦]](https://github.com/Homiss/Java-interview-questions/blob/master/%E6%A1%86%E6%9E%B6/Spring%20%E9%9D%A2%E8%AF%95%E9%A2%98.md) + +# 中间件 + +- [[RabbitMQ 实战][书籍]](https://book.douban.com/subject/26649178/) +- [[从 Paxos 到 Zookeeper][书籍]](https://book.douban.com/subject/26292004/)] +- [[Apache Dubbo][文档]](http://dubbo.apache.org/zh-cn/) +- [[nginx 快速入门之基本原理篇][入门]](https://zhuanlan.zhihu.com/p/31196264) +- [[深入理解 Nginx][书籍]](https://book.douban.com/subject/22793675/) + +# 编程语言思想 + +- [[函数式编程初探][入门]](http://www.ruanyifeng.com/blog/2012/04/functional_programming.html)] +- [[函数式编程][全面]](https://coolshell.cn/articles/10822.html) +- [[闭包][文档]](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Closures) +- [[尾调用优化]](http://www.ruanyifeng.com/blog/2015/04/tail-call.html) + From 2204e7c69ff63a240e85b81d20ca7f28f1e8f911 Mon Sep 17 00:00:00 2001 From: Dwade3 <36162683+PualrDwade@users.noreply.github.com> Date: Mon, 10 Dec 2018 20:20:35 +0800 Subject: [PATCH 55/55] =?UTF-8?q?Update=20=E8=AE=BE=E8=AE=A1=E6=A8=A1?= =?UTF-8?q?=E5=BC=8F.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 桥接模式模式增加了体现该模式特征的代码片段(多维度各自拓展) --- notes/设计模式.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/notes/设计模式.md b/notes/设计模式.md index f20a807a..dfa0a80d 100644 --- a/notes/设计模式.md +++ b/notes/设计模式.md @@ -2557,6 +2557,10 @@ public class Client { remoteControl1.on(); remoteControl1.off(); remoteControl1.tuneChannel(); + RemoteControl remoteControl2 = new ConcreteRemoteControl2(new Sony()); + remoteControl2.on(); + remoteControl2.off(); + remoteControl2.tuneChannel(); } } ```