面经笔记数据结构

合集下载

数据结构面试知识点

数据结构面试知识点

数据结构面试知识点数据结构是计算机科学中非常重要的一个概念,它涉及到各种用于存储和组织数据的方法和技术。

在计算机科学的面试中,数据结构是一个常见的考察点。

本文将介绍一些常见的数据结构面试知识点,包括数组、链表、栈、队列、树和图等。

一、数组数组是一种线性数据结构,它由一组连续的内存空间组成,用于存储相同类型的数据。

数组的特点是随机访问,即可以通过索引直接访问数组中的任意元素。

在面试中,常见的数组问题包括数组的插入、删除、查找等操作,以及数组的排序算法,如冒泡排序、快速排序等。

二、链表链表是一种动态数据结构,它由一组节点组成,每个节点包含一个数据元素和一个指向下一个节点的指针。

链表的特点是插入和删除操作的效率高,但查找操作的效率较低。

在面试中,常见的链表问题包括链表的反转、链表的环检测、链表的合并等操作,以及链表的快慢指针算法等。

三、栈栈是一种后进先出(LIFO)的数据结构,它只允许在栈顶进行插入和删除操作。

在面试中,常见的栈问题包括括号匹配、表达式求值、中缀表达式转后缀表达式等操作,以及栈的应用,如逆波兰表达式求值、深度优先搜索等。

四、队列队列是一种先进先出(FIFO)的数据结构,它允许在队尾插入元素,在队头删除元素。

在面试中,常见的队列问题包括滑动窗口最大值、循环队列实现、用栈实现队列等操作,以及队列的应用,如广度优先搜索、任务调度等。

五、树树是一种非线性数据结构,它由一组节点组成,每个节点包含一个数据元素和若干指向子节点的指针。

树的特点是层次结构和递归定义,常见的树结构包括二叉树、二叉搜索树、平衡二叉树等。

在面试中,常见的树问题包括二叉树的遍历、二叉搜索树的插入和删除操作、平衡二叉树的调整等,以及树的应用,如最小生成树、哈夫曼树等。

六、图图是一种非线性数据结构,它由一组节点和边组成,节点表示数据元素,边表示节点之间的关系。

图的特点是网络结构和复杂性,常见的图结构包括有向图、无向图、加权图等。

在面试中,常见的图问题包括图的遍历、最短路径算法、拓扑排序等,以及图的应用,如最小生成树、最大流问题等。

北京市考研计算机复习资料数据结构常见面试题解析

北京市考研计算机复习资料数据结构常见面试题解析

北京市考研计算机复习资料数据结构常见面试题解析数据结构是计算机考研中的重要内容之一,也是面试中常见的考点。

深入理解和掌握数据结构的基本概念、算法和应用是非常关键的。

本文将对北京市考研计算机复习资料中常见的数据结构面试题进行解析,帮助考生更好地准备面试。

一、线性表1. 请简要描述线性表的定义和特点。

线性表是一种由n个数据元素组成的有限序列,其中n表示线性表中数据元素的个数。

线性表的特点是数据元素之间存在着一对一的线性关系,即除了表头和表尾元素之外,其他元素都只有一个直接前驱和一个直接后继。

2. 请解释顺序表和链表的区别。

顺序表是指将线性表的元素按照其逻辑顺序依次存放在一组地址连续的存储单元中。

顺序表的主要特点是随机访问,即可以通过下标直接访问表中的任意元素。

链表是指将线性表的元素存放在一组不连续的存储单元中,每个元素中保存了指向直接后继元素的指针。

链表的主要特点是插入和删除操作的效率较高,但访问元素需要按照链表中的指针依次遍历。

二、栈和队列1. 请解释栈和队列的定义和特点。

栈是一种特殊的线性表,其中插入和删除操作只能在同一端进行。

栈的特点是后进先出(LIFO),即最后插入的元素最先被删除。

队列也是一种特殊的线性表,其中插入操作在队尾进行,删除操作在队头进行。

队列的特点是先进先出(FIFO),即最先插入的元素最先被删除。

2. 请解释栈的应用场景,并给出一个示例。

栈的应用场景包括函数调用、表达式计算等。

以函数调用为例,当一个函数被调用时,会将函数的返回地址、参数和局部变量等信息压入栈中,然后执行函数体内的代码。

当函数执行完毕后,栈顶的元素被弹出,程序返回到调用函数的位置继续执行。

三、树和二叉树1. 请解释树和二叉树的定义和特点。

树是一种非线性表,其中的数据元素之间存在着一对多的层次关系。

树的特点是由根节点、子节点和叶节点组成,任意节点可以有多个子节点。

二叉树是一种特殊的树,其中每个节点最多有两个子节点。

cs-notes面试笔记 (2)

cs-notes面试笔记 (2)

cs-notes面试笔记引言概述:CS-Notes是一份面试笔记,旨在帮助计算机科学学习者准备面试。

该笔记内容丰富,包含了计算机科学的各个方面,从数据结构和算法到操作系统和网络,都有详细的解释和示例。

本文将以引言概述、正文内容和总结三个部分,详细介绍CS-Notes面试笔记的五个大点。

正文内容:1. 数据结构与算法1.1 数组和链表:介绍数组和链表的特点、使用场景以及它们的优缺点。

1.2 栈和队列:解释栈和队列的定义、操作和应用,包括逆波兰表达式、迷宫问题等。

1.3 树和图:讲解二叉树、平衡树和图的基本概念、遍历算法和常见的应用场景。

1.4 排序和查找:介绍常见的排序算法,如冒泡排序、快速排序以及二分查找等。

1.5 动态规划和贪心算法:详细解释动态规划和贪心算法的原理和应用,如背包问题和最短路径问题等。

2. 操作系统2.1 进程和线程:解释进程和线程的概念、区别和应用,包括同步和互斥等问题。

2.2 内存管理:介绍内存管理的基本原理,包括分页、分段和虚拟内存等。

2.3 文件系统:讲解文件系统的组织结构和操作,如文件的创建、读取和删除等。

2.4 进程调度:解释进程调度算法,如先来先服务、短作业优先和时间片轮转等。

2.5 死锁:详细讲解死锁的概念、原因以及预防和解决死锁的方法。

3. 计算机网络3.1 OSI七层模型:介绍OSI七层模型的层次结构和各层的功能。

3.2 TCP/IP协议:解释TCP/IP协议的基本原理,包括IP地址、端口号和数据传输过程等。

3.3 HTTP和HTTPS:详细讲解HTTP和HTTPS的区别、工作原理和应用场景。

3.4 DNS:介绍DNS的作用和解析过程,包括域名解析和递归查询等。

3.5 网络安全:讲解网络安全的基本概念、攻击方式和防范措施,如DDoS攻击和防火墙等。

4. 数据库4.1 关系型数据库:介绍关系型数据库的特点和常见的SQL语句,如查询、插入和更新等。

4.2 非关系型数据库:解释非关系型数据库的优点和应用场景,如键值存储和文档存储等。

计算机考研面试重点知识

计算机考研面试重点知识

计算机考研面试重点知识1. 数据结构与算法在计算机考研面试中,数据结构与算法是重点考察的内容之一。

以下是一些常见的数据结构和算法的知识点:数据结构•数组:包括一维数组和多维数组,了解数组的基本操作和特性。

•链表:了解单向链表、双向链表和循环链表,以及它们的插入、删除和遍历操作。

•栈和队列:了解栈和队列的基本操作和应用场景。

•树:了解二叉树、平衡二叉树、红黑树等常见的树结构,以及它们的遍历和查找算法。

•图:了解图的表示方法,以及图的遍历和最短路径算法。

•哈希表:了解哈希表的原理和应用场景。

算法•排序算法:了解常见的排序算法,如冒泡排序、插入排序、选择排序、快速排序、归并排序等,以及它们的时间复杂度和空间复杂度。

•查找算法:了解常见的查找算法,如线性查找、二分查找、哈希查找等,以及它们的时间复杂度和应用场景。

•动态规划:了解动态规划的基本思想和应用场景。

•贪心算法:了解贪心算法的基本思想和应用场景。

•图算法:了解常见的图算法,如最短路径算法、最小生成树算法等。

2. 操作系统操作系统是计算机考研面试中的重要知识点,以下是一些常见的操作系统的知识点:•进程与线程:了解进程和线程的概念、区别和联系,以及多线程的优缺点。

•调度算法:了解常见的进程调度算法,如先来先服务、短作业优先、轮转调度等。

•内存管理:了解内存的分段、分页和虚拟内存的概念及其实现方式。

•文件系统:了解文件的组织方式,如目录结构、文件分配方法等。

•死锁:了解死锁的原因、预防和解决方法。

•设备管理:了解设备管理的基本原理和调度算法。

3. 计算机网络计算机网络是计算机考研面试中的重要知识点,以下是一些常见的计算机网络的知识点:•OSI七层模型:了解OSI七层模型的每一层的功能和作用。

•TCP/IP协议族:了解TCP/IP协议族的体系结构和各层功能,如IP 协议、TCP协议、UDP协议等。

•网络设备:了解路由器、交换机、网卡等网络设备的功能和特点。

数据结构知识点笔记

数据结构知识点笔记

数据结构知识点笔记一、数据结构的概念数据结构是计算机科学中一门重要的学科,它研究如何组织和存储数据,以便高效地访问和操作。

数据结构可以分为物理结构和逻辑结构两个层次。

物理结构指数据在计算机内存中的存储方式,而逻辑结构则指数据之间的逻辑关系。

二、常用的数据结构1. 数组(Array)数组是最基本的数据结构之一,它以连续的存储空间来保存相同类型的数据。

数组的特点是可以通过下标快速访问元素,但插入和删除操作较慢。

2. 链表(Linked List)链表是一种动态数据结构,它通过指针将一组节点串联起来。

链表的特点是插入和删除操作效率高,但访问元素需要遍历整个链表。

3. 栈(Stack)栈是一种后进先出(LIFO)的数据结构,只能在栈顶进行插入和删除操作。

栈主要用于函数调用和表达式求值等场景。

4. 队列(Queue)队列是一种先进先出(FIFO)的数据结构,只能在队列的一端进行插入操作,在另一端进行删除操作。

队列主要用于任务调度和缓冲区管理等场景。

5. 树(Tree)树是一种非线性的数据结构,由父节点和子节点组成。

树常用于组织和管理具有层级关系的数据,如文件系统和数据库索引等。

6. 图(Graph)图是一种由节点和边组成的数据结构,节点表示数据,边表示节点之间的关系。

图广泛应用于网络分析和路径搜索等领域。

三、常见的数据结构操作1. 插入(Insert)插入操作将新的数据元素加入到数据结构中的特定位置。

不同的数据结构插入操作的复杂度各不相同,需要根据具体情况选择合适的数据结构。

2. 删除(Delete)删除操作将指定的数据元素从数据结构中移除。

和插入操作一样,删除操作的复杂度也依赖于具体的数据结构。

3. 查找(Search)查找操作用于在数据结构中寻找指定值的元素。

不同的数据结构采用不同的查找算法,如线性查找、二分查找和哈希查找等。

4. 排序(Sort)排序操作将数据结构中的元素按特定规则重新排列。

排序算法可以分为比较排序和非比较排序两种类型,如冒泡排序、快速排序和归并排序等。

FTE面试中常见的数据结构、算法题及解题技巧分享

FTE面试中常见的数据结构、算法题及解题技巧分享

FTE面试中常见的数据结构、算法题及解题技巧分享FTE(Full-Time Equivalent)的面试是许多技术人员求职的必经之路。

在FTE面试中,面试官会以多种形式考查应聘者的数据结构和算法能力。

本文将分享FTE面试中常见的数据结构、算法题以及解题技巧,帮助读者提升自己的面试竞争力。

一、数据结构题1. 链表反转题目描述:给定一个单向链表,将其反转并返回反转后的头节点。

例如:输入:1 -> 2 -> 3 -> 4 -> NULL输出:4 -> 3 -> 2 -> 1 -> NULL解题思路:遍历链表,将当前节点的next指针指向前一个节点,然后将当前节点和前一个节点向后移动。

代码实现:```c++ListNode* reverseList(ListNode* head) {ListNode* cur = head;// 当前节点ListNode* pre = NULL;// 前一个节点while (cur != NULL) {ListNode* next_node = cur->next;// 下一个节点cur->next = pre;// 反转pre = cur;// pre向后移动cur = next_node;// cur向后移动}return pre;// 返回反转后链表的头节点}```2. 前K个高频元素题目描述:给定一个非空的整数数组,返回其中出现频率前k高的元素。

例如:输入:nums = [1,1,1,2,2,3],k=2输出:[1,2]解题思路:使用哈希表存储每个元素出现的频率,然后使用堆排序取出前k个最高频率的元素。

代码实现:```c++vector<int> topKFrequent(vector<int>& nums, int k) {unordered_map<int, int> freq_map;// 初始化哈希表 for (int num : nums) {freq_map[num]++;// 增加元素出现的频率}priority_queue<pair<int, int>> pq;// 使用大根堆存储前k大的频率for (auto iter = freq_map.begin(); iter !=freq_map.end(); ++iter) {pq.push(make_pair(iter->second, iter->first));// 将元素出现的频率作为排序依据,存入堆中 if (pq.size() > k) {pq.pop();// 如果堆的大小超过k,弹出堆顶元素}}vector<int> res;// 存储结果while (!pq.empty()) {res.push_back(pq.top().second);// 将堆中剩余的元素取出来pq.pop();}return res;}```二、算法题1.快速排序题目描述:对一个整数数组进行快速排序。

技术面试基础知识题

技术面试基础知识题

技术面试基础知识题一、数据结构与算法在技术面试中,数据结构与算法是必考的基础知识。

以下是一些常见的问题:1.什么是数组?如何在数组中插入和删除元素?2.什么是链表?请写一个函数来反转一个链表。

3.什么是栈和队列?分别用数组和链表实现栈和队列。

4.什么是二叉树?请写一个函数来判断一棵二叉树是否是平衡二叉树。

5.什么是图?请写一个函数来判断一个图是否是连通图。

二、操作系统与计算机网络操作系统和计算机网络也是面试中经常问到的基础知识。

以下是一些常见的问题:1.什么是进程和线程?它们之间有什么区别?2.什么是死锁?如何避免死锁的发生?3.什么是TCP和UDP?它们之间有什么区别?4.什么是HTTP和HTTPS?它们之间有什么区别?5.什么是OSI模型?请列举出每一层的功能。

三、数据库对于大多数技术岗位来说,数据库知识也是必备的。

以下是一些常见的问题:1.什么是关系型数据库和非关系型数据库?请举例说明。

2.什么是SQL?请写一个SQL语句来查询一个表中的数据。

3.什么是索引?如何创建索引和优化索引的性能?4.什么是事务?请写一个SQL语句来开启一个事务。

5.什么是数据库的范式?请列举出前三个范式。

四、编程语言在技术面试中,对于某种编程语言的掌握也是考察的重点之一。

以下是一些常见的问题:1.什么是面向对象编程?请写一个类和它的实例。

2.什么是异常处理?请写一个try-catch语句来处理异常。

3.什么是多态?请写一个代码示例来说明多态的概念。

4.什么是闭包?请写一个代码示例来说明闭包的概念。

5.什么是线程和进程的区别?请写一个代码示例来说明。

五、软件工程与系统设计对于一些技术岗位来说,软件工程和系统设计的知识也是必备的。

以下是一些常见的问题:1.什么是敏捷开发?请列举出敏捷开发的原则。

2.什么是设计模式?请列举出常用的设计模式。

3.什么是微服务架构?请列举出微服务架构的优势和劣势。

4.什么是负载均衡?请列举出常见的负载均衡算法。

2020面试题总结数据结构篇_一目斋

2020面试题总结数据结构篇_一目斋
final int hash; final K key; //用 volatile 修饰 Node 的元素 val 和指针 next,在多线程环境下保持可见性。 volatile V val; volatile Node<K,V> next; Node(int hash, K key, V val, Node<K,V> next) {
使用 ConcurrentHashMap。这两个选项之间的首选是使用 ConcurrentHashMap,这是因为我们不需要锁定整个对象。
此外,刚才提到 Collections.synchronizedMap,这里单独多说一点,它的原理 超级简单,就是内部多加一个锁(在构造函数中初始化为 SynchronizedMap 类 本身),每次调用 get、put 等方法时都用 synchronized 方法块来实现同步功 能。
// Backing Map
final Object
much to synchronize
SynchronizedMap(Map<K,V> m) {
this.m = Objects.requireNonNull(m);
mutex = this;
}
SynchronizedMap(Map<K,V> m, Object mutex) {
private static class SynchronizedMap<K,V>
implements Map<K,V>, Serializable {
private static final long serialVersionUID = 1978198479659022715L;
private final Map<K,V> m;
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

数据结构及算法知识1.字典树构造及其优化与应用字典树的核心就是空间换时间,利用字符串的公共前缀来避免无谓的字符串比较,降低查询时间性质:- 根结点不包含字符,除了根结点每个结点都包含一个字符- 从根结点到某一结点的路径经过的字符连接起来就是该结点对于的字符串- 查询和建树可以同时进行有一个1G大小的一个文件,里面每一行是一个词,词的大小不超过16字节,内存限制大小是1M。

返回频数最高的100个词。

思路:首先要求得每个词的频率,1G无法放入内存,需要分成多个小文件,对每个小文件的词进行统计(1)散列分治:顺序读取文件,对每个词,可以hash(x)P00(只要不小于1024个文件,是为了保证每个小文件可以放入内存),这样被映射为5000个小文件,每个文件大概200K,每个文件最少1250个单词(2)对于每个小文件,利用hash_map/字典树记录每个单词出现的频率,(3)用100个元素的最小堆,选出每个文件中的频率最大的100个单词(4)对这5000个小文件进行归并排序,选出最大的100个。

2.大规模文本文件,全是单词,求前10词频的单词(Top k问题是热门问题)3.如何判断时间,空间复杂度是否为O(logn)最直观的判断就是程序中采用了二分,且二分后只运算数据的一半。

但如果两部分都运算的话,时间复杂度就是O(nlogn)了。

其实不一定是二分,只不过二分比较常用罢了4.各个算法的时间和空间复杂度5.M个有序链表取前k大个元素6.红黑树的调整红黑树是一种近似平衡的二叉查找树,它能够确保任何一个节点的左右子树的高度差不会超过二者中较低那个的一倍1.每个节点要么是红色,要么是黑色。

2.根节点必须是黑色3.红色节点不能连续(也即是,红色节点的孩子和父亲都不能是红色)。

4.对于每个节点,从该点至null(树尾端)的任何路径,都含有相同个数的黑色节点。

在树的结构发生改变时(插入或者删除操作),往往会破坏上述条件3或条件4,需要通过调整使得查找树重新满足红黑树的条件。

调整可以分为两类:一类是颜色调整,即改变某个节点的颜色;另一类是结构调整,即改变检索树的结构关系。

结构调整过程包含两个基本操作:左旋(Rotate Left),右旋(RotateRight)。

红黑树是一种自平衡二叉查找树。

它对于二叉树有了“颜色”上的限制,我们可以看下它的五点性质:1.树中的结点是红色或黑色。

2.根结点是黑色。

3.空结点(NIL)为叶子结点,并且为黑色。

4.红结点的子结点一定是黑色结点。

5.从一个结点到该结点的叶子结点的所有路径上包含相同数目的黑结点。

如果空结点的父结点是红色结点时,那么空结点的兄弟结点一定也是空结点。

通俗点说,红结点下面一旦出现空结点就是两个,不会出现黑+空,或者红+空的情况。

如果是黑+空,那么违反了性质5,如果出现红+空,那么违反了性质4.如果空结点的父结点是黑结点时,那么空结点的兄弟结点一定不是黑结点。

一样的道理,如果出现了黑+空,就会违反性质5。

总结一下,红黑树最底层只会出现两种情况,一种是底层两个都是空结点,另外一个是父结点为黑结点,子结点一个红色,一个为空,并且该红结点的两个子结点都是空。

增加结点实际上可以看作先对该结点进行查找,如果存在,就把该结点的值更新,如果不存在,就在查找到最后返回时的空结点位置处增加该结点。

对于红黑树而言,我们需要在增加完结点后,对这个树的结构进行一些调整,使树满足红黑树条件。

首先,为了算法的简便,我们默认插入的是红结点,因为,红结点的增加,不会改变树中的黑色结点数,即不会影响性质5。

现在考虑插入的情况,从我们上节中总结的规律可以看出,在树的最底层只有3种情况,其中父亲结点为黑时,你可以在下面直接插入红结点,不需要做出任何改变。

因为黑色结点下面是可以有红色的,不违背红黑树的任意一条规则。

所以,只有一种情况需要进行结构调整,那就是父节点为红,并且此时插入结点的兄弟结点为空。

对于删除操作,实际上就是找到待删除结点的后继结点,然后把后继结点删除,并把后继结点的值给到删除结点。

7.贪心算法与其弊端8.判断一个链表是否有环,如何找到这个环的起点剑指offer的题目,利用快慢指针是否会相会来判断是否有环,如果快指针都跑到结尾了还没碰到慢指针则无环。

先让快慢指针跑,当快慢指针相交的时候一定是在环中,那么这个时候再让慢节点跑,再次和快节点相会的时候,走过的长度就是环的长度len,这个时候定义两个速度一样的指针,指针1先跑len,这时指针2再从起点跑,两指针相交的地方就是环的起点。

9.红黑树在STL上的应用avl用于搜索,插入删除次数少场景,用在win的内核中很多;红黑:查找,用在STL中map set,java 中的treemap,linux进程调度公平调度用于管理进程控制块;B/B++用于文件系统、数据库中做索引。

10.动态规划的原理与本质(动态规划dynamic programming是笔试热门题型)根据状态转移方程和临界条件,要求全局最大解,动态规划的本质也是通过分治的方法将大问题分解成小问题。

11.统计二进制中1的个数12. 背包问题的详细解释动态规划,建表,保存之前的最优状态。

13.大数量整数的去重问题14.算法题:环形公路上加油站算法问题(此题比较经典,可百度到)15.实现bitmap数据结构,包括数据的存储与插入方式16.实现unordered_map,键为string,value不限17.实现unordered_map过程中的冲突解决办法18.字符串hash成状态位的具体实现方式19.Epoll怎么实现的?通过epoll-create系统调用eventpoll类型的句柄,其中包括红黑树节点和双向链表头结点,通过epoll-ect系统调用,向epoll中添加,删除,修改感兴趣的事件,返回0表示成功,返回-1表示失败,最后通过epoll-wait系统判断双向链表是否为空,为空则阻塞,当文件状态符改变时,fd上的回调函数被调用,将fd加入到双向链表中,此时epoll-wait被唤醒。

20.hash函数如何保证冲突最小解决hash冲突的方式,1.链址开放法,2.拉链法21.算法题1:给定有序数组,取前面某段调整到最后,即进行一次旋转操作后,对任意元素进行快速查询。

敲代码不运行22.算法题2:n对括号正常匹配情况的枚举输出。

敲代码不运行23.算法题1:无序数组查找第Top k元素。

手写代码实现24.算法题2:并查集。

手写代码实现https:///UFv59to8/article/details/78466907这个博客并查集讲的很好25.算法题3:链表反转。

手写代码实现26.算法题1:枚举给定数组中的所有非递减子序列27.算法题2:枚举给定数组的全排列28.算法题1:给定二叉树,假设相连接的两结点间距离为1,求所有结点中距离其他所有结点距离和最小的结点。

29.算法题1:给定数组,快速求出所有数右边第一个比其大的数30.算法题2:给定k个数组,每个数组都是有序的,且每个数组最大值-最小值<1000,1<k<1000,求所有数的中位数。

31.红黑树的了解与其查找复杂度(红黑树的特性和复杂度是热门问题)32.快速排序的优化1.优化一:三数取中法,解决数据基本有序的(就是找到数组中最小下标,最大下标,中间下标的数字,进行比较,把中间大的数组放在最左边)2.优化二:随机选取基准引入的原因:在待排序列是部分有序时,固定选取枢轴使快排效率底下,要缓解这种情况,就引入了随机选取枢轴,思想:取待排序列中任意一个元素作为基准3.优化三:优化小数组的交换,就是为了解决大才小用的问题,原因:对于很小和部分有序的数组,快排不如插排好。

当待排序序列的长度分割到一定大小后,继续分割的效率比插入排序要差,此时可以使用插排而不是快排4.优化四:在一次分割结束后,可以把与Key相等的元素聚在一起,继续下次分割时,不用再对与key相等元素分割具体过程:在处理过程中,会有两个步骤第一步,在划分过程中,把与key相等元素放入数组的两端第二步,划分结束后,把与key相等的元素移到枢轴周围33.字符串匹配算法KMP算法(没看懂,就了解了是一段字符进行匹配)34.游戏中打怪时已经各个小怪的坐标,你放一个技能是圆形范围,快速求能打到的小怪(范围搜索问题,热门场景考察题)35.魔兽世界10人房间,现在组队规模有3人,有5人,如何让每个人等待的时间尽可能少,即将时间线上哪些队伍组合在一起开始一个游戏(01背包问题的应用题)36.快速排序的稳定化算法(此方法可百度到)37.算法题:平面上百万个点,设计数据结构求每个点最近的k个点(范围搜索问题)38.判断二叉树是不是镜像,手写翻转二叉树39.算法题:字符串转整数,敲代码40.手写二叉树最近公共祖先41.手写层序遍历二叉树并输出结点层数42.手画字典树对每一个节点而言,从根节点到它的路径就是一个单词,如果该节点被标记为红色则说明该单词存在。

以第一节定义的时间单位为准,从查找效率来看,假设将文章读入字典树后,在每一个单词的末字母节点上标记上它出现的次数,则后续查找一个单词出现的总次数所花费的时间仅是O(d)。

从存储空间上来看,第一节的三种结构都需要存储所有的单词,比如ab、abc、abde三个词需要存储所有单词的所有字母共9个字母,而字典树则可以利用相同前缀的单词共享前缀空间的特性,只需要存储5个字母。

所以无论从时间效率还是空间容量来说,字典树对于大量字符串数据的处理都是优于一般的数据结构的。

43.介绍更高效的建树判重数据结构44.范围搜索算法(仍然是这个热门场景题45.算法题:n乘m的矩形填充到N乘M的矩形中能否填充满问题46.算法题2:快速排序47.二叉树的遍历1.先序遍历非递归先序遍历算法基本思路:使用堆栈a. 遇到一个节点,访问它,然后把它压栈,并去遍历它的左子树;b. 当左子树遍历结束后,从栈顶弹出该节点并将其指向右儿子,继续a步骤;c. 当所有节点访问完即最后访问的树节点为空且栈空时,停止。

2.中序遍历48.动态规划与贪心算法的区别与联系动态规划和贪心算法都是一种递推算法,均有局部最优解来推导全局最优解不同点:贪心算法:1.贪心算法中,作出的每步贪心决策都无法改变,因为贪心策略是由上一步的最优解推导下一步的最优解,而上一部之前的最优解则不作保留。

2.由(1)中的介绍,可以知道贪心法正确的条件是:每一步的最优解一定包含上一步的最优解。

动态规划算法:1.全局最优解中一定包含某个局部最优解,但不一定包含前一个局部最优解,因此需要记录之前的所有最优解2.动态规划的关键是状态转移方程,即如何由以求出的局部最优解来推导全局最优解3.边界条件:即最简单的,可以直接得出的局部最优解贪心算法典型问题:给钱问题。

相关文档
最新文档