可能有点标题党,但看完这篇文章后你决定不会这么认为了,甚至标题中的 15k 也许可以改成 20k。不废话,直接上干货。
各大公司的笔试基本都考这个,《剑指 Offer》上的所有题目如果能背下来,LeetCode 刷个一百到三百道题,参加过 ACM 竞赛的也可以。
《剑指 Offer》,指的是《剑指 Offer:名企面试官精讲典型编程题》这本书,里面剖析了 50 个典型的程序员面试题,包括基础知识、代码质量、解题思路、优化效率和综合能力等 5 个方面。
LeetCode,一个在线刷题网站,包含了海量技术面试题,包括算法、数据结构 和 系统设计等 1000+ 题目,能帮助大家快速地提高编程技能,轻松拿下世界知名 IT 企业的梦幻 Offer。
给大家推荐一份谷歌大佬的刷题笔记,这书贼好,看完后再刷 LeetCode 的话,头皮就不再发麻了!
GitHub 疯传,史上最强,谷歌大佬的刷题笔记可以下载了
LeetCode 上收录了 75 道《剑指 Offer》上的技术面试考题,有位运算、哈希表、堆、字符串、数组、查找、栈和队列、树、递归与循环、链表等多类题目。
ACM 竞赛,由 ACM(AssociationforComputingMachinery,美国计算机协会)组织,是世界各地计算机程序设计者大显身手的舞台,也是世界一流大学展现教育成果的最佳窗口。
算法题虽然被很多人不屑,就像古代的八股文一样,但企业都这么考,不准备的话,很难不挂!
计算机存储、组织数据的方式,包括数组、链表、栈、二叉树、哈希表等,算法是解决问题的方案,为数据结构服务。算法能对数据结构中的数据进行各种处理,比如查找数组中的数据,或对其进行排序等等。
在 Java 中,数据结构一般可以分为两大类:线性数据结构和非线性数据结构。哈哈,这个非字很有灵魂吧?
线性数据结构有数组,代表作除了数组本身,还有 ArrayList;还有链表,代表作是 LinkedList;还有栈,遵循后进先出的原则,也就是“Last In First Out”(简称 LIFO)——最后的一个进的,最先出去;还有队列,只允许在队尾添加数据,队首移除数据。队列在 Java 中的出现频率非常高,有各种不同的类来满足不同的场景需求。像优先级队列 PriorityQueue、延时队列 DelayQueue 等等。
非线性数据结构有树,由 n(n>0)个有限节点组成的一个具有层次关系的集合。之所以叫“树”,是因为这种数据结构看起来就像是一个倒挂的树,只不过根在上,叶在下;还有哈希表,也叫散列表,是一种可以通过关键码值(key-value)直接访问的数据结构,它最大的特点就是可以快速实现查找、插入和删除;还有图,由顶点的有穷非空集合和顶点之间边的集合组成,通常表示为:G(V,E),其中,G 表示一个图,V 是图 G 中顶点的集合,E 是图 G 中边的集合。
虽然不需要在面试官前面手推各种数据结构的时间空间复杂度,也不需要手写红黑树、B 树、B+ 树,最起码要清楚 ArrayList 与 LinkedList 之间的差异,要知道 HashMap 的扩容机制。
计算机是由 CPU、内存、显示器这些设备组成的硬件,但我们大学毕业后,往往从事的是软件方面的开发工作。那怎样才能在硬件和软件之间自由穿梭呢?答案就是学好计算机组成原理。
弄明白了计算机的组成原理,也就对整个软件开发有了一个系统的认知,不论是计算机的硬件原理,还是软件架构,都能很好的驾驭,随之而来的,我们的职业发展机会也就更多了。
计算机组成原理这门课完全可以用一个词来概括,就是“抽象”。在我看来这也是整个计算机设计中所蕴含的的灵魂。
把《深入理解计算机系统》这本书吃了吧!
当今这个时代,没有网络简直无法生存,哪怕是在电梯里的一分钟,我都受不了那种手机没有网络的状态。我们所学的编程知识,如果脱离了网络,将变得毫无意义,因为没有哪个编程语言是要在单机环境下运行的。
计算机网络这门课实在是太重要,几乎是面试必问的内容,什么 TCP/IP 三次握手,四次挥手,TCP 和 UDP 的区别,HTTP 协议等等。
一开始学 Java 的话,可能会觉得计算机网络没什么用武之地,等到你开始接触 Tomcat,接触 Nginx,接触网络编程,比如 BIO 和 NIO,以及网络编程框架 Netty,你就会感慨,要是劳资当初把计算机网络这块的知识打牢该多好呀。
入门书有《图解 HTTP》、《图解 TCP/IP》、《网络是怎样链接的》,再深入的话推荐《计算机网络:自顶向下》。
为什么要学习操作系统呢?
第一,面试要考;
第二,无论学习哪门子编程语言,比如说 Java、C/C++,都需要和操作系统打交道,像 Java 中的多线程技术,其实是由操作系统来负责进程和线程管理的;
第三,学习操作系统,还能学到内存分配方面的知识。
可以先看一看《现代操作系统》,知道 OS 的大概;然后再看《操作系统—精髓与设计原理》、《Linux内核设计与实现》,达到这样一个水平:
Linux 的话,推荐《鸟哥的 Linux 私房菜》。
学习一门编程语言,如果不去操作下数据,就感觉这门编程语言空有皮囊却没有灵魂,对吧?要想学好数据,首先要学习一下 SQL,推荐《SQL 必知必会》,然后是 MySQL,推荐《高性能 MySQL》。
再拓展的话,还有 Redis,互联网技术领域中使用最广泛的存储中间件,推荐《Redis 深度历险:核心原理与应用实战》。
还有 MongoDB,非关系型数据库,推荐《MongoDB权威指南》。
我认为设计模式是初中级程序员迈向高级程序员的必经之路。有不少程序员,前期冲劲十足,但后继乏力,都是吃了设计模式的亏。在工作的前几年,大部分程序员都处于熟悉编程语言的阶段,也就是处于“技”的阶段,随后就要进入“术”的阶段了。在编程领域,“术”的典型代表就是“设计模式”。
大家都听说过,学习设计模式非常的重要,那么为什么这么重要呢,设计模式到底是什么?打个比喻学编程就像学武功一样。
武功要练得很牛逼,有两样东西不能丢。第一,是内功;第二,是武功秘籍。内功对应到编程就是我们编程基础能力,那编程的设计模式就可以想象成武术中的武功秘籍。
推荐《设计模式之禅》,我认为是设计模式领域 3 本经典著作之一,也是我们国内程序员写的一本书,趣味化十足,读起来也非常容易理解。
除了这本纸质书,推荐好朋友小傅哥的一本 PDF,全网疯狂下载超 3 万次。我在另外一篇文章里有详细介绍:
设计模式,牛逼!设计模式,牛逼!设计模式,牛逼!
有不少小伙伴曾私信我说,大三下半学期了,发现身边很多同学都拿到了实习 Offer,突然意识到,自己也得找工作了。然后有点迷茫,不知道该怎么学习。所以,我要对各位学弟学妹们提点建议。
1)多看信息密度大、质量高的资料
像我在文中提到的两份资料,可以说都是业界公认最优质的资料,如果你能认认真真从里面学到 70%,可以说已经领先大部分人了。
尤其是我提到的那些书籍,虽然读起来很费时间,但学完后知识也会更加的全面和系统。
2)要有危机意识
计算机这个行业已经很卷了,对吧?但每年依然有大量的新人涌入,你不刷题,你不下劲,自然就会有人把你甩在身后。
想要拿到满意的 offer,最好按照我说的来!该打基础的使劲打!
3)伟大的牛逼之前总是傻逼式的坚持
你可能会在很多地方看到一些大牛侃侃而谈,似乎他们在吹逼。但要看到他们背后的辛苦,他们背后付出的努力。
敲代码是门手艺活,不信看看你键盘上的 ctrl+c 和 ctrl + v,哈哈哈,调皮下~~~~该敲的代码一定要敲,就像卖油翁的故事,唯手熟尔!
祝大家都能学得愉快,学得开心,拿到满意的 Offer, 从一键三连做起吧!