链接地址::https://github.com/kdn251/interviews/blob/master/README-zh-cn.md
数据结构
Linked List
- 链表即是由节点(Node)组成的线性集合,每个节点可以利用指针指向其他节点。它是一种包含了多个节点的、能够用于表示序列的数据结构。
- 单向链表: 链表中的节点仅指向下一个节点,并且最后一个节点指向空。
- 双向链表: 其中每个节点具有两个指针 p、n,使得 p 指向先前节点并且 n 指向下一个节点;最后一个节点的 n 指针指向 null。
- 循环链表:每个节点指向下一个节点并且最后一个节点指向第一个节点的链表。
- 时间复杂度:
- 索引:
O(n)
- 搜索:
O(n)
- 插入:
O(1)
- 移除:
O(1)
- 索引:
Stack
- 栈是元素的集合,其包含了两个基本操作:push 操作可以用于将元素压入栈,pop 操作可以将栈顶元素移除。
- 遵循后入先出(LIFO)原则。
- 时间复杂度:
- 索引:
O(n)
- 搜索:
O(n)
- 插入:
O(1)
- 移除:
O(1)
Queue
- 队列是元素的集合,其包含了两个基本操作:enqueue 操作可以用于将元素插入到队列中,而 dequeeu 操作则是将元素从队列中移除。
- 遵循先入先出原则 (FIFO)。
- 时间复杂度:
- 索引:
O(n)
- 搜索:
O(n)
- 插入:
O(1)
- 移除:
O(1)
Tree
- 树是无向、连通的无环图。
Binary Tree
- 二叉树即是每个节点最多包含左子节点与右子节点这两个节点的树形数据结构。
- 满二叉树: 树中的每个节点仅包含 0 或 2 个节点。
- 完美二叉树(Perfect Binary Tree): 二叉树中的每个叶节点都拥有两个子节点,并且具有相同的高度。
- 完全二叉树: 除最后一层外,每一层上的结点数均达到最大值;在最后一层上只缺少右边的若干结点。
Binary Search Tree
- 二叉搜索树(BST)是一种特殊的二叉树,其任何节点中的值都会大于或者等于其左子树中存储的值并且小于或者等于其右子树中存储的值。
- 时间复杂度:
- 索引:
O(log(n))
- 搜索:
O(log(n))
- 插入:
O(log(n))
- 删除:
O(log(n))
- 索引:
Trie
- 字典树,又称基数树或者前缀树,能够用于存储键为字符串的动态集合或者关联数组的搜索树。树中的节点并没有直接存储关联键值,而是该节点在树中的挂载位置决定了其关联键值。某个节点的所有子节点都拥有相同的前缀,整棵树的根节点则是空字符串。
Fenwick Tree
- 树状数组又称 Binary Indexed Tree,其表现形式为树,不过本质上是以数组实现。数组中的下标代表着树中的顶点,每个顶点的父节点或者子节点的下标能够通过位运算获得。数组中的每个元素包含了预计算的区间值之和,在整棵树更新的过程中同样会更新这些预计算的值。
- 时间复杂度:
- 区间求值:
O(log(n))
- 更新:
O(log(n))
- 区间求值:
Segment Tree
- 线段树是用于存放间隔或者线段的树形数据结构,它允许快速的查找某一个节点在若干条线段中出现的次数.
- 时间复杂度:
- 区间查询:
O(log(n))
- 更新:
O(log(n))
- 区间查询:
Heap
- 堆是一种特殊的基于树的满足某些特性的数据结构,整个堆中的所有父子节点的键值都会满足相同的排序条件。堆更准确地可以分为最大堆与最小堆,在最大堆中,父节点的键值永远大于或者等于子节点的值,并且整个堆中的最大值存储于根节点;而最小堆中,父节点的键值永远小于或者等于其子节点的键值,并且整个堆中的最小值存储于根节点。
- 时间复杂度:
- 访问:
O(log(n))
- 搜索:
O(log(n))
- 插入:
O(log(n))
- 移除:
O(log(n))
- 移除最大值 / 最小值:
O(1)
- 访问:
Hashing
- 哈希能够将任意长度的数据映射到固定长度的数据。哈希函数返回的即是哈希值,如果两个不同的键得到相同的哈希值,即将这种现象称为碰撞。
- Hash Map: Hash Map 是一种能够建立起键与值之间关系的数据结构,Hash Map 能够使用哈希函数将键转化为桶或者槽中的下标,从而优化对于目标值的搜索速度。
- 碰撞解决
- 链地址法(Separate Chaining): 链地址法中,每个桶是相互独立的,包含了一系列索引的列表。搜索操作的时间复杂度即是搜索桶的时间(固定时间)与遍历列表的时间之和。
- 开地址法(Open Addressing): 在开地址法中,当插入新值时,会判断该值对应的哈希桶是否存在,如果存在则根据某种算法依次选择下一个可能的位置,直到找到一个尚未被占用的地址。所谓开地址法也是指某个元素的位置并不永远由其哈希值决定。
Graph
- 图是一种数据元素间为多对多关系的数据结构,加上一组基本操作构成的抽象数据类型。
- 无向图(Undirected Graph): 无向图具有对称的邻接矩阵,因此如果存在某条从节点 u 到节点 v 的边,反之从 v 到 u 的边也存在。
- 有向图(Directed Graph): 有向图的邻接矩阵是非对称的,即如果存在从 u 到 v 的边并不意味着一定存在从 v 到 u 的边。
算法
排序
快速排序
- 稳定: 否
- 时间复杂度:
- 最优时间:
O(nlog(n))
- 最坏时间:
O(n^2)
- 平均时间:
O(nlog(n))
- 最优时间:
归并排序
- 归并排序是典型的分治算法,它不断地将某个数组分为两个部分,分别对左子数组与右子数组进行排序,然后将两个数组合并为新的有序数组。
- 稳定: 是
- 时间复杂度:
- 最优时间:
O(nlog(n))
- 最坏时间:
O(nlog(n))
- 平均时间:
O(nlog(n))
- 最优时间:
桶排序
- 桶排序将数组分到有限数量的桶子里。每个桶子再个别排序(有可能再使用别的排序算法或是以递归方式继续使用桶排序进行排序)。
- 时间复杂度:
- 最优时间:
Ω(n + k)
- 最坏时间:
O(n^2)
- 平均时间:
Θ(n + k)
- 最优时间:
基数排序
- 基数排序类似于桶排序,将数组分割到有限数目的桶中;不过其在分割之后并没有让每个桶单独地进行排序,而是直接进行了合并操作。
- 时间复杂度:
- 最优时间:
Ω(nk)
- 最坏时间:
O(nk)
- 平均时间:
Θ(nk)
- 最优时间:
图算法
深度优先搜索
- 深度优先算法是一种优先遍历子节点而不是回溯的算法。
- 时间复杂度:
O(|V| + |E|)
广度优先搜索
- 广度优先搜索是优先遍历邻居节点而不是子节点的图遍历算法。
- 时间复杂度:
O(|V| + |E|)
拓扑排序
- 拓扑排序是对于有向图节点的线性排序,如果存在某条从 u 到 v 的边,则认为 u 的下标先于 v。
- 时间复杂度:
O(|V| + |E|)
Dijkstra 算法
- Dijkstra 算法 用于计算有向图中单源最短路径问题。
- 时间复杂度:
O(|V|^2)
Bellman-Ford 算法
- Bellman-Ford 算法是在带权图中计算从单一源点出发到其他节点的最短路径的算法。
- 尽管算法复杂度大于 Dijkstra 算法,但是它适用于包含了负值边的图。
- 时间复杂度:
- 最优时间:
O(|E|)
- 最坏时间:
O(|V||E|)
- 最优时间:
Floyd-Warshall 算法
- Floyd-Warshall 算法 能够用于在无环带权图中寻找任意节点的最短路径。
- 时间复杂度:
- 最优时间:
O(|V|^3)
- 最坏时间:
O(|V|^3)
- 平均时间:
O(|V|^3)
- 最优时间:
Prim 算法
- Prim 算法是用于在带权无向图中计算最小生成树的贪婪算法。换言之,Prim 算法能够在图中抽取出连接所有节点的边的最小代价子集。
- 时间复杂度:
O(|V|^2)
Kruskal 算法
- Kruskal 算法同样是计算图的最小生成树的算法,与 Prim 的区别在于并不需要图是连通的。
- 时间复杂度:
O(|E|log|V|)
位运算
- 位运算即是在位级别进行操作的技术,合适的位运算能够帮助我们得到更快地运算速度与更小的内存使用。
- 测试第 k 位:
s & (1 << k)
- 设置第 k 位:
s |= (1 << k)
- 第 k 位置零:
s &= ~(1 << k)
- 切换第 k 位值:
s ^= ~(1 << k)
- 乘以 2:
s << n
- 除以 2:
s >> n
- 交集:
s & t
- 并集:
s | t
- 减法:
s & ~t
- 交换
x = x ^ y ^ (y = x)
- 取出最小非 0 位(Extract lowest set bit):
s & (-s)
- 取出最小 0 位(Extract lowest unset bit):
~s & (s + 1)
- 交换值:
x ^= y; y ^= x; x ^= y;
算法复杂度分析
大 O 表示
- 大 O 表示 用于表示某个算法的上限,往往用于描述最坏的情况。
小 O 表示
- 小 O 表示用于描述某个算法的渐进上界,不过二者要更为紧密。
大 Ω 表示
- 大 Ω 表示用于描述某个算法的渐进下界。
小 ω 表示
- Little Omega Notation用于描述某个特定算法的下界,不过不一定很靠近。
Theta Θ 表示
- Theta Notation用于描述某个确定算法的确界。
相关推荐
谷歌技术面试准备指南 Google技术面试是每一一个申请软件 工程师岗位的候选人都需要进行的面试。每一-场面试持续45分钟 ,面试内容涵盖你的简历经历,编程、算法以及数据结构。我们会期待看到你不仅仅是完成题目,而且...
1. **技术面试**:准备回答关于嵌入式系统设计的问题,如中断处理、内存管理、任务调度等。熟悉数据结构和算法,因为它们在优化代码性能时至关重要。 2. **动手能力**:面试官可能会测试你的实际操作技能,如编写...
其次,**系统设计**是软件工程面试中的关键环节,它考察候选人的架构思维和大规模系统设计能力。系统设计通常涉及网络、数据库、并发、可扩展性、容错性等多个方面。面试者可能被要求设计一个简单的API,或者解决大...
- **总结项目经验**:准备好过往参与的项目案例,特别是那些能够体现个人技术能力和解决问题能力的项目。 - **提升软技能**:如沟通表达、团队协作等,这些在面试过程中同样重要。 - **了解行业动态**:关注当前最新...
【个人简历制作指南——软件工程师篇】 在求职过程中,一份精心制作的个人简历是打开职业大门的敲门砖。对于软件工程师来说,简历不仅要展示你的技术能力,还要体现你的项目经验、学习能力和团队协作精神。以下是一...
《.NET程序员面试指南》是一本专为准备.NET程序员面试者设计的实用参考资料,旨在帮助求职者更好地理解和应对面试中的各种技术问题。该指南涵盖了.NET框架的基础知识、C#编程语言、ASP.NET web开发、数据库交互、...
"软件测试工程师面试准备指南" 软件测试工程师面试准备是许多软件测试工程师面临的挑战。为了帮助软件测试工程师更好地准备面试,本文提供了一份详细的面试准备指南。 编程语言准备 在软件测试工程师面试中,编程...
您的软件工程技术面试个人指南。 维护者 - 翻译 目录 在线评委 实时编码练习 数据结构 链表 链表是数据元素的线性集合,称为节点,每个元素通过指针指向下一个节点。 它是由一组节点组成的数据结构,这些节点一起...
《C嵌入式程序员面试指南》是一份专为C语言和嵌入式系统开发者准备的面试攻略,旨在帮助他们充分理解和展示在该领域所需的关键技能和知识。这份指南覆盖了从基础的C语言编程到复杂的嵌入式系统设计等多个方面,以...
简介:软件工程技术面试个人指南。 链接: 收藏数:94.9k Algorithm_Interview_Notes-Chinese 简介:2018/2019/校招/春招/秋招/算法/机器学习(Machine Learning)/深度学习(Deep Learning)/自然语言处理(NLP)/C
软件工程技术面试个人指南 编程之法:面试和算法心得 技术面试最后反问面试官的话 笔试面试知识整理 银行笔试面试经验分享及资料分享 腾讯,阿里,字节跳动,Shopee,美团,滴滴高频面试题 19 年初的后端社招面试...
在程序员的求职过程中,技术面试是至...总的来说,虽然"程序员找工作,技术面试指南"这份资料可能有些年份,但它涵盖的面试知识点至今仍具有指导意义。持续学习和实践这些知识,将使你在竞争激烈的IT行业中保持竞争力。
软件测试行业介绍,软件测试从业人员要求,软件测试技术基础,典型测试工程师笔试题讲解,测试人员的从业经验总结,新人工作指南
leetcode中国 WIKI 的定位,主要记录一下技术相关的好资源索引『站在巨人的肩膀上学习』主要还是索引为主 ...软件工程技术面试个人指南,包含了算法等内容 国内互联网大厂的面试题 英文 计算机科学学习清单 关于P
《软件工程师面试大全》是为准备投身或正在从事软件工程领域的专业人士量身打造的一份全面的面试指南。它涵盖了从基础理论到高级实践,从编程语言到框架技术,从问题解决到项目管理等多个方面,旨在帮助求职者在面试...
《gct软件工程复试资料》的出现,无疑为广大的考生提供了一份宝贵的复习指南。该资料不仅包含了殷人昆版和孙家广版两套教材的重点内容,还包含了相应的PPT课件、习题以及参考答案,是一套全面的复习工具。 对于殷...
### 软件工程师测试面试集锦 #### 1. 为什么需要进行软件测试? 软件测试是为了确保软件产品的质量和稳定性而进行的一项重要活动。通过测试,可以发现并修正软件中存在的缺陷或错误,确保软件能够按照预期的功能...
您的软件工程技术面试个人指南。 有关以下采访问题的视频解决方案,并有详细说明,可在找到。 维护者-小 翻译 目录 的YouTube 每日字节 Instagram 文章 在线评委 实时编码实践 数据结构 链表 链表是数据元素(称为...
软件工程框架是一个结构化的指南,用于定义软件开发过程中的各个阶段、活动和任务。它帮助团队组织工作流程,并确保软件项目的顺利进行。 #### 软件工程原则 软件工程原则是指导软件开发的最佳实践集合。这些原则...
《程序员面试指南(英文版)》是一本专为程序员准备的面试宝典,由John Mongan、Noah Suojanen和Eric Gigure三位作者共同撰写。这本书详细讲解了程序员在求职过程中可能遇到的各种面试问题,涵盖了从基础的编程概念...