这世界上最难的事情便是入门 ------ 沃兹 • 格硕德 The hardest thing in the world is getting started. ------ Wlatz · Githord
三大基础
操作系统
- 操作系统常用名词解释(CPU和处理机到底啥关系?指令和程序又是什么关系? 简单介绍了操作系统的常用专业术语的解释。)
- 作业、进程、线程与协程
- 从存储器到页面置换(多层存储结构、程序装载方式、内存数据存储方式、虚拟存储器、页面置换算法)
- 从代码到进程(预编译、编译、汇编、链接、加载、虚拟内存的存储结构、Python的解释执行过程)
- 说道说道死锁(基础中的基础)
- 进程同步与进程、线程通信问题(临界区与邻接资源、互斥与同步、软硬件/信号量同步机制、经典的进程同步问题如生产者和消费者/哲学家进餐/读者-写者等、进程通信方法)
- 进程调度算法(非剥夺(非抢占)式调用、剥夺(抢占)式调用、可剥夺可不剥夺(可抢占可不抢占)式调用、应用场景)
- Linux常见命令
计算机网络
- 三次握手以及四次挥手(基础中的基础)
- TCP拥塞控制(面试必问)
- select、poll、epoll的原理(socket编程:多路I/O复用模型)
- TCP粘包是怎么回事
- 面试相关链接整理
数据库
汇总
数据库主要考察SQL、DBMS、Mysql、Redis四个方面的知识。
- SQL & DBMS & Mysql & Redis 相关知识
- SQL:连接查询、分组查询、视图、触发器、存储过程
- DBMS:事务管理、AICD、隔离级别、常见的并发问题(脏读、不可重复读、幻读)、封锁、悲观锁和乐观锁、MVCC原理和实现、范式理论、SQL与NoSQL
- Mysql:常用命令、Mysql索引以及优化、B+树原理、查询优化原则、InnoDB和MyISAM比较、切分、水平切分与垂直切分、日志系统
- Redis原理、Redis使用场景、 跳表/字典/哈希冲突/基本数据类型、线程安全、持久化、事件驱动模式、事物实现原理、数据淘汰原则、主从复制过程1)
Redis
Redis是C语言开发的一个开源的(遵从BSD协议)高性能键值对(key-value)的内存数据库,可以用作数据库、缓存、消息中间件等。它是一种NoSQL(not-only sql,泛指非关系型数据库)的数据库。(Redis的定义和特点)
Redis作为一个内存数据库。1、性能优秀,数据在内存中,读写速度非常快,支持并发10W QPS;2、单进程单线程,是线程安全的,采用IO多路复用机制;3、丰富的数据类型,支持字符串(strings)、散列(hashes)、列表(lists)、集合(sets)、有序集合(sorted sets)等;4、支持数据持久化,可以将内存中数据保存在磁盘中,重启时加载;5、主从复制,哨兵,高可用;6、可以用作分布式锁;7、可以作为消息中间件使用,支持发布订阅。(Redis的优点)
算法与数据结构
算法
回溯算法(高频)
参考链接
贪心算法总结
分治算法
动态规划算法(高频)
二分查找与搜索算法(高频)
排序算法
位运算
不常见算法
阶乘系统、格雷编码、数字1的个数求解。
数据结构
链表
参考链接
总结
1、见到链表就要想到指针 ,双指针、快慢指针等等。
- 双指针的奇妙作用
- LeetCode 19. 删除链表的倒数第N个节点(中):利用双指针间隔进行控制慢指针停下来的位置。
- LeetCode 142. 环形链表 II(中):检测循环节点位置。
- hash map作用
- LeetCode 23,把一个链表操作处理成了排序问题。
- LeetCode 141,把一个链表操作处理成了计数统计问题。
2、保持声明哑结点的好习惯,使用哑结点可以防止特殊情况。 3、解链表节点操作(LeetCode 19)、链表合并(LeetCode 23)、链表翻转(LeetCode 24/25/92/206)、循环链表检测(LeetCode 141/142)。 4、特别注意链表翻转类型题目的递归、迭代写法。 5、链表中用hash map解决问题(链表合并/环链表检测),用空间换取时间,如果要优化,可以用指针操作避免使用hash map。
树
栈和队列
字符串与哈希表(重点)
数组去重的几种方法
1、最简单的方法就是开辟一个动态新数组,遍历原来的数组,未出现的才添加,时间复杂度为线性 \(O(n)\)。本质就是hash map。
1 |
|
2、基于排序,将数组排序,然后遍历,重复的元素一定连续分布着,连续跳过就好了。
1 |
|
3、对于海量的数据,可以先分桶,然后再分治的使用上面两种方法中的一种去层层处理。
图与堆
算法复杂度分析
参考链接
高频题目整理
系统设计
系统设计类问题是利用现有的数据结构,基于问题本身出发,考虑实际情况解决问题。
论术求道
有道无术,术尚可求也,有术无道,止于术。
《神雕侠侣》中的杨过在石壁上发现了剑魔独孤求败刻下的字,其中有这么几句:
「紫薇软剑」三十岁前所用,误伤义士不祥,悔恨无已,乃弃之深谷。 重剑无锋,大巧不工。四十岁前恃之横行天下。 四十岁后,不滞于物,草木竹石均可为剑。自此精修,渐进于无剑胜有剑之境。
其中有三把剑:紫薇软剑、玄铁重剑、无剑。这三把剑似乎能解释这个问题:
紫薇软剑 三十岁前,独孤求败用紫薇软剑来驰骋天下,这时,他依靠的是剑,是用剑作为“器”的性状来发挥威力。没有这把剑,也许他的战斗力就会下降很多。
这时,对于剑的运用,他只达到了“器”的层面。
玄铁重剑 三十岁到四十岁,他开始用玄铁重剑。剑只是一个介质,本身并不锋利,大巧不工。他是用本身的招数在驱动着剑,恃之横行天下。这些招数,这些使用剑的方法,就是“术”。
这时,对于剑的运用,他已经达到了“术”的层面。
无剑 四十岁后,他终于做到了受众无剑,心中有剑,草木竹石皆可为剑,以无剑胜有剑。他掌握的,是达到目标的“道”,这个“道”,不会因为对象(器)而改变、也不会因为方法(术)而改变。
这时,对于剑的运用,他终于达到了“道”的层面。
举两个现实的例子:
1、编程 Java、C++、C# 这些编程语言,就是“器”; 设计模式等方法,就是“术”; 面向对象等思想,就是“道”。
2、设计 PS/AI/FW 等软件,就是“器”; 任务分析、可用性测试、卡片分类法等,就是“术”; 以用户为中心的思想、各种启发式原则,就是“道”;
作者:马力和知群 链接:https://www.zhihu.com/question/19805899/answer/13020652 来源:知乎 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
设计模式
设计模式是解决问题的方案,学习现有的设计模式可以做到经验复用。拥有设计模式词汇,在沟通时就能用更少的词汇来讨论,并且不需要了解底层细节。
代码格式
《编程珠玑》系列文章
《重构:改善既有代码的技术》系列文章
编程语言
Python和C++是编程语言的两个极端,Python作为基于Python解释器的解释型语言,学习成本低,开发难度低,但是运行效率很低。C++作为编译型语言,接近底层,内存也交由程序员管理,学习成本高,开发难度高,但是运行图效率高。Java则是开发效率和执行效率折中的选择。私以为,Python和C++是程序员必须掌握了两门编程语言。
Python
- Python基础整理
- Python高级特性
- Python函数编程
- Python面向对象
- Python进程与线程
- Python解释器原理
- Python网络编程
- Python的错误、调试和测试
- 代码格式
- Python面试真题
- 正则(适用于不同语言)
C++
- C++面试
- C++基本语法
- C++后台开发
- 《C++后台开发 核心技术与应用实践》
- [《Linux高性能服务器编程》](