这世界上最难的事情便是入门 ------ 沃兹 • 格硕德 The hardest thing in the world is getting started. ------ Wlatz · Githord

三大基础

操作系统

计算机网络

数据库

汇总

数据库主要考察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
3
4
5
6
7
8
new = []
nums = [1, 2, 3, 3, 3, 4, 5]
for i in nums:
if i in new:
continue
else:
new.append(i)
print(new)

2、基于排序,将数组排序,然后遍历,重复的元素一定连续分布着,连续跳过就好了。

1
2
3
4
5
6
7
8
9
10
11
12
13
new = []
nums = [1, 2, 3, 3, 3, 4, 5]
nums.sort()
i = 0
while i < len(nums):
new.append(nums[i])
while True:
i += 1
if i < len(nums) and nums[i] == nums[i-1]:
pass
else:
break
print(new)

3、对于海量的数据,可以先分桶,然后再分治的使用上面两种方法中的一种去层层处理。

图与堆

算法复杂度分析

参考链接

算法复杂度分析

高频题目整理

LeetCode统计的面试高频题目

系统设计

系统设计类问题是利用现有的数据结构,基于问题本身出发,考虑实际情况解决问题。

系统设计相关题目

论术求道

有道无术,术尚可求也,有术无道,止于术。

《神雕侠侣》中的杨过在石壁上发现了剑魔独孤求败刻下的字,其中有这么几句:

「紫薇软剑」三十岁前所用,误伤义士不祥,悔恨无已,乃弃之深谷。 重剑无锋,大巧不工。四十岁前恃之横行天下 四十岁后,不滞于物,草木竹石均可为剑。自此精修,渐进于无剑胜有剑之境。

其中有三把剑:紫薇软剑、玄铁重剑、无剑。这三把剑似乎能解释这个问题:

紫薇软剑 三十岁前,独孤求败用紫薇软剑来驰骋天下,这时,他依靠的是剑,是用剑作为“器”的性状来发挥威力。没有这把剑,也许他的战斗力就会下降很多。

这时,对于剑的运用,他只达到了“器”的层面。

玄铁重剑 三十岁到四十岁,他开始用玄铁重剑。剑只是一个介质,本身并不锋利,大巧不工。他是用本身的招数在驱动着剑,恃之横行天下。这些招数,这些使用剑的方法,就是“术”。

这时,对于剑的运用,他已经达到了“术”的层面。

无剑 四十岁后,他终于做到了受众无剑,心中有剑,草木竹石皆可为剑,以无剑胜有剑。他掌握的,是达到目标的“道”,这个“道”,不会因为对象(器)而改变、也不会因为方法(术)而改变。

这时,对于剑的运用,他终于达到了“道”的层面。

举两个现实的例子:

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语言学习百度脑图:密码( 0vUF)

C++