Todo:
- 什么是数组?
- 数组是如何实现随机访问的?
- 使用malloc新建二维数组
- 数组中查找元素、添加元素的时间复杂度分析
- 实现一个支持动态扩容的数组
- 实现一个大小固定的有序数组,支持动态增删改操作
- 实现两个有序数组合并为一个有序数组
- 单链表
- 单链表反转
- 两个有序链表的合并
- 求链表的中间结点(若长度为偶数,返回前面的节点)
- 求链表的倒数第k个节点
- 判断链表中是否存在环
- 求链表中环的入口节点
- 判断两个无环链表是否有交叉点
- 判断两个有环链表是否有交叉点
- 连个链表的第一个公共节点
- 单链表快速排序
- 单链表归并排序
- 双向链表
- 循环链表
- 链表中查找元素、添加元素的时间复杂度分析
- 数组和链表的不同区别在哪里
- 使用链表实现LRU
- 栈的基本概念
- 顺序栈
- 链式栈
- 栈是否为空
- 括号匹配
- 如何实现浏览器的前进和后退
- 队列的基本概念
- 顺序队列
- 链式队列
- 循环队列
- 队空和队满的判断条件
- 阻塞队列
- 并发队列
- 字符串匹配
- BF算法
- RK算法
- KMP算法
- Trie树
- AC自动机
- 树的定义
- 树的抽象类型以及表示方法
- 二叉树的定义
- 二叉树的抽象类型和表示方法
- 二叉树
- 二叉树的深度
- 二叉树的宽度
- 二叉树的镜像
- 判断二叉树是否对称
- 判断二叉树是否是平衡二叉树
- 不分行从上到下打印二叉树(所有的值一行输出)
- 分行从上到下打印二叉树,同一层的节点按从左到右的顺序打印,每一层打印一行
- 之字形打印二叉树,第一层按照从左到右的顺序打印,第二层按照从右到左的顺序打印,第三层再按照从左到右的顺序打印,以此类推
- 二叉搜索树的第k大节点(中序遍历)
- 二叉查找树
- 平衡二叉树
- 递归树
- LSM树
- 红黑树
- 图的定义
- Dijkstra最短路径算法
- 邻接表的创建 (数组 + 链表 = 邻接表)
- Asort 由TwoSum想到asort
- 冒泡排序
- 插入排序
- 选择排序
- 快速排序
- 归并排序
- 桶排序
- 时间复杂度和空间复杂度分析
- 如何根据年龄给100万用户数据排序
- 通用的高性能的排序函数
- 二分查找
- 二分查找的应用和变形
-
Manacher's Algorithm - Linear Time Longest Palindromic Substring - Part 1
-
Manacher's Algorithm - Linear Time Longest Palindromic Substring - Part 2
-
Manacher's Algorithm - Linear Time Longest Palindromic Substring - Part 3
-
Manacher's Algorithm - Linear Time Longest Palindromic Substring - Part 4
- 什么是分组交换和TCP/IP
- 因特网中正在使用什么样的通信链路
- 什么是分部式应用
- 集线器(Hub):集线器是指对接收到的信号进行再生整形发达,以扩大网络的传输距离,同时把所有节点集中在以它为中心的结点上。它发送数据时都是没有针对性的,而是采用广播的方式发送,也就是说当要向某节点发送数据时,不是直接把数据发送到目的节点,而是把数据包发送到与集线器相连的所有节点。
- 交换机(Switch):是一种用于电(光)信号转发的网络设备。它可以接入交换机的任意两个网络结点提供独享的电信号通路。集线器本身不能识别MAC地址和IP地址,交换机内部的CPU会在每个端口成功连接时,通过将MAC地址和端口对应,形成一张MAC表,在以后的通讯中,发往MAC地址的数据包仅送往其对应的端口,而不是所有的端口。
- IP是地址,可以理解为门牌号有定位功能
- Mac地址是身份证,没有定位功能
- IP地址分类 (A/B/C/D/E),IP分公有IP和私有IP.
- CIDR(无类型域间选路),10.100.122.2/24(前24位是网络号,后8位是主机号)
- 广播地址:主机标识段全为1
- 子网掩码:结合IP地址一起使用,用来指明一个IP地址的那些位是主机所在的子网,那些位是主机的位掩码。主要作用就是将某个IP地址分成网络地址和主机地址两部分
- 网络号: 子网掩码和ip地址按位与
- 只要是在网络上跑的包,都是完整的,可以有下层没上层,绝对不可能有上层没下层
- 当网络包到达下一个城关的时候,可以通过路由表得到下一个城关的IP地址,直接通过IP地址找就可以了,为什么还要通过本地的MAC地址呢?
####DHCP
- DHCP(Dynamic Host Configuration Protocol)是一个局域网的网络协议,使用UDP协议工作,主要用于内部网络或网络服务供应商自动分配IP地址。
- DHCP协议主要是用来给客户租用IP地址,和房产中介很像,要商谈、签约、续租,广播还不能抢单
- TCP和UDP有什么区别?
- 描述一下TCP三次握手和四次挥手的过程
- TCP有哪些状态
- TCP的LISTEN状态是什么
- TCP的CLOSE_WAIT状态是什么
- 建立一个socket连接要经历哪些步骤
- 你是如何理解TCP协议的
- 滑动窗口
- 粘包
- 常见的HTTP状态码有哪些
- 301和302有什么区别
- 504和500有什么区别
- HTTPS和HTTP有什么区别
- 谈谈你所理解的HTTP协议?
- 订阅分库分表的Binlog是怎么订阅的
- 分库分表的数据源中加入存在主键冲突要怎么解决
- MySQL的存储引擎用的是什么?为什么选InnoDB?
- MySQL的聚簇索引和非聚簇索引有什么区别
- B+树和二叉树有什么区别和优劣
- 什么是列式数据库
- 列式数据库和常用的数据库如MySQL有什么区别
- ClickHouse 的特点是什么
- Reids 支持哪些数据结构
- 每种数据结构的底层是怎么实现的
- 为什么在业务中使用Redis,Redis有什么优点
- 使用过Redis在哪些场景
- ZSET是怎么实现的?如何实现跳表
- 分布式锁
- 进程和线程的区别
- 什么是多线程
- 线程间通信的多种方式
-
Linux中如何查找一个文件是否存在
-
shell
图书:Linux命令行与shell脚本编程大全 第3版 to read
- 如何动态计算数组的大小:使用sizeof,sizeof(arr) / sizeof(arr[0])
- typedef 的用法
- Go的设计理念是什么?
- Go的原理是什么?
- 为什么要有Go这门语言呢?
- Go语言有什么特点呢?
- 它的优点是什么?缺点是什么?
- Go适合什么场景下面使用?为什么适合呢?
- Go's Declaration Syntax:这篇文章介绍了为什么Go使用不同的声明方式,同时也对比了C语言的声明方式
- Go Slices:usage and internals
- Go Slice of the destinction between length and capacity
- goroutine是怎么调度的
- goroutine和kernel thread 之间是什么关系
- Go 和 PHP 和 C 的区别,以及三者的GC
- Golang的gc算法
- Golang的逃逸分析是什么?怎么避免内存taoyi
- Golang的GC触发时机是什么
- 条件判断比较多的情况下,将异常情况明显的显示出来,尽量不适用if-else 嵌套,可以直接if (true){异常处理} return 中断掉,这样逻辑不会那么复杂,而且代码比较清晰明了.
- 为什么要使用设计模式
- 使用设计模式解决了是问题
- 如何高效或者什么场景下更适合使用设计模式
- 单例
- 工厂
- 观察者
- 版本控制
版本控制是一种记录一个或若干文件内容变化,以便用来将来查阅特定版本修订情况的系统。
- 为什么要引入版本控制 引入版本控制,有了它你就可以 将某个文件回溯到之前的状态,甚至将某个项目回退到过去某个时间点的状态,你可以比较文件的变化细节,查出最后是谁修改了哪个地方,从而找出导致怪异问题出现的原因,又是谁在何时报告了某个功能缺陷等等。就算你乱来一气把整个项目中的文件改的改删的删,你也照样可以轻松恢复到原先的样子,但额外增加的工作量却微乎其微。
就像拥有了《哆啦A梦》中的时光机一样,你可以跨越时空,回到过去的版本,看看原来的代码发生了什么变化,可以更好的解决问题。
- 使用版本控制有什么需要注意的地方
- Git和其他版本控制(包括Subversion和近似工具)的区别
Git和其他版本控制系统的主要差别在于Git对待数据的方法。概念上来看区分,其他大部分系统以文件变更列表的方式存储信息。这类系统(CVS、Subversion、Perforce等等)将它们保存的信息看作是一组基本文件和每个文件随时间逐步累积的差异。
Git不按照以上方式对待或保存数据。反之,Git更像是把数据看作是对小型文件系统的一组快照。每次你提交更新,或在Git中保存项目状态时,它主要对当时的全部文件制作一个快照并保存这个快照的索引。为了高效,如果文件没有修改,Git不再从新存储该文件,而是只保留一个链接指向之前存储的文件。Git对待数据更像是一个快照流。
Git存储每个文件与初始版本的差异,存储项目随时间改变的快照。
Git近乎所有操作都是本地执行。举个例子,要浏览项目的历史,Git不需外连到服务器去获取历史,然后再显示出来,它只需直接从本地数据库中读取。你能立即看到项目历史。如果你想查看当前版本与一个月前的版本之间引入的修改,Git会查找到一个月前的文件做一次本地的差异计算,而不是由远程服务器处理或从远程服务器拉回旧版本文件再来本地处理。
- Git的三种状态
已提交(committed)、已修改(modified)、已暂存(staged).
已提交:表示数据已经安全的保存在本地数据库汇总。
已修改:表示修改了文件,但还没保存到数据库中。
已暂存: 表示对一个已修改的文件的当前版本做了标记,使之包含在下次提交的快照中。
由此引入Git项目的三个工作区的概念:Git仓库、工作目录以及暂存区域。
- Git的三个工作区域:
工作目录、暂存区域、Git仓库。
Git仓库: Git仓库目录是Git用来保存项目的元数据和对象数据库的地方。这是Git中最重要的部分,从其他计算机克隆仓库时,拷贝的就是这里的数据。
工作目录: 工作目录是对项目的某个版本独立提取出来的内容。这些从Git仓库的压缩数据库中提取出来的文件,放在磁盘上供你使用和修改。
暂存区域:暂存区域是一个文件,保存了下次将提交的文件列表信息,一般在Git仓库目录中。有时候也被称作“索引”,不过一般说法还是叫暂存区域。
- 基本的Git工作流程:
1.在工作目录中修改文件
2.暂存文件,将文件的快照放入暂存区域
3.提交更新,找到暂存区域的问题件,将快照永久性存储到Git仓库目录。
如果Git目录中保存着特定版本的文件,就属于已提交状态。如果做了修改并已放入暂存区域,就属于已暂存状态。如果自上次取出后,做了修改但还没有放到暂存区域,就是已修改状态。
- Git常用的命令有哪些
- Git的几种状态
- 如何回退到最后一次修改信息
- 如何高效地解决冲突
- 线上出现问题了,如何回滚
- 如何规范地使用git commmit
- 分支管理
- 常用的gitflow工作模型
- Git的原理是什么
- 为什么要使用消息队列
- 使用消息队列解决了什么问题
- 引入消息队列对系统或者架构有什么影响
- 使用消息队列有什么好处
- 使用消息队列有什么需要注意的地方或者说是坏的地方
- Kafka的消费者是如何进行消息去重的
- Kurbernets是什么?可以用来做什么
- 用了Kurbernets之后解决了哪些问题
- Kubernets 的Service 是什么概念?怎么实现的
- Informer 是怎么实现的?有什么作用
- StatefulSet用过吗?有什么特点,滚动升级是如何实现的
- Kubernets的所有资源约定了版本号,为什么要这么做
- 假如有多个版本号并存,那么K8s服务端需要维护几套代码
- Kubernets的架构是怎么样的
- 为什么要使用Docker
- Docker解决了什么问题
- 什么是微服务?为什么要用微服务?
- 谈一谈对微服务的理解
- 如何进行限流
- 文章的评论量非常大,比如说一篇热门文章有几百万的评论,设计一个后端服务,实现评论的时序展示与分页
- 分库分表如何设计?垂直平分、水平拆分?
- 业务ID的生成规则
- 什么时候应该使用缓存
- 缓存应该怎么设计
- 缓存解决了什么问题
- 如何更好的使用缓存
- Redis 和 Memcache 选择哪一种作为缓存服务,为什么这样选择
- 缓存雪崩怎么处理
- 缓存服务器挂了怎么解决
- 泛型编程
- 函数式编程
- 面向对象编程
- DRY-避免重复原则
- KISS-简单原则
- 迪米特法则
- 面向对象的S.O.L.I.D原则
- 如何定位一个线上问题(CPU高负载)
- Self-examination(自我审视)
- 反思自己
- 职业规划
- 态度:空杯心态,很强的学习能力和进取心
- 程序员修养
- 由数据结构想到拼积木
- 如何阅读源码
- 生活无需对比,没有对比就没有伤害,于代码和工程,需对比,反思、调整、打磨、改进、交付
- 继「做正确的事,等着被开除」后,与左耳朵耗子问答 | 新知 · 实录
- 如何做LeetCode
- 接下来应该做什么可以继续提升?
- 我在硬性技能(编码、架构)上有什么长处?
- 我在软技能(沟通,团队)有什么优点?
- 我是谁?
- 我在哪?
- 我要干什么?
- 我要去哪?
- 我应该干什么?
- 我现在在干什么?
- 我现在应该干什么?
-
学习建议from左耳朵耗子
-
一定要坚持,要保持长时间学习,甚至终生学习的态度
-
一定要动手,不管例子多么简单,建议至少自己动手敲一遍看看是否理解了里头的细枝末节
-
一定要学会思考,思考为什么要这样,而不是那样,还要举一反三地思考
-
不要乱买书,不要乱追技术新名词,基础的东西经过很长时间积累,会在未来至少10年通用
-
回顾一下历史,看看历史时间线上技术的发展,你才能明白明天会是神马样的
- 英文能力
- 问问题的能力
- 写代码的修养,代码规范,单元测试,Code Review
- 安全防范
- 软件工程和上线
- 学习一个技术,理解它背后的设计理念、原理和解决问题的方法,远远比技术本身是什么更重要.
- 学会看官方文档
轻松在 VPS 搭建 Shadowsocks(我现在使用的是这种方式,我现在使用的时候有的时候不稳定会连接不上,但是是可以使用的,上手也比较快)
《C语言程序设计:现代方法:第2版》
《大话数据结构》
《算法:C语言实现(第1-4部分)》
《现代操作系统》
《计算机网络》
《数据库系统概念》
《鸟哥的Linux私房菜》
《数据结构与算法之美》(极客时间专栏)


