数据结构部分:
1、数组和链表的区别。(很简单,但是很常考,记得要回答全面)
C++语言中可以用数组处理一组数据类型相同的数据,但不允许动态定义数组的大小,即在使用数组之前必须确定数组的大小。而在实际应用中,用户使用数组之前无法确定数组的大小,只能够将数组定义成足够大小,这样数组的空间可能不被使用,从而造成内存空间的浪费。链表是一种常见的数据组织形式,他采用动态分配内存的形式实现。需要时可以用new分配内存空间,不需要时用delete将已分配的空间释放,不会造成内存空间的浪费。
从逻辑结构上来看,数组必须实现定于固定的长度,不能适应数据动态增减的情况,即数组的大小一旦定义就不能改变。当数据增加是,可能超过原先定义的元素的个数;当数据减少时,造成内存浪费;链表动态进行存储分配,可以适应数据动态地增减的情况,且可以方便地插入、删除数据项。
从内存存储的角度看;数组从栈中分配空间(用new则在堆上创建),对程序员方便快速,但是自由度小;链表从堆中分配空间,自由度大但是申请管理比较麻烦。
从访问方式类看,数组在内存中是连续的存储,因此可以利用下标索引进行访问;链表是链式存储结构,在访问元素时候只能够通过线性方式由前到后顺序的访问,所以访问效率比数组要低。
2、链表的一些操作,如反转,链表陈钊环路判断,双向链表,循环链表相关操作。
3、队列,栈的应用。(比如对垒在消息队列,站用在递归调用中)
4、二叉树的是那种遍历方式及其递归和非递归实现,三种遍历方式的主要应用(后缀表达式),相关的时间复杂度。
5、字符串相关
整型,浮点型和字符串的转换(atoi,atof,itoa)
字符串拷贝注意异常检查,比如空指针,字符串重叠,自赋值,字符串结束符‘\0’等。
小知识点
![](https://i-blog.csdnimg.cn/blog_migrate/67b0a8c0282fb7774f1a07ff0e02e3cc.png)
1、用链表表示线性表的优点是(便于插入和删除操作)
2、单链表中,增加头结点的目的是(方便运算的实现)
3、栈和队列的共同特点是(只允许在端点处插入和删除元素)
4、栈通常采用的两种存储结构是(线性存储结构和链表存储结构)
5、队列具有(先进先出)的特征,栈具有(后进先出)的特征。
6、链表(插入和删除不需要移动元素,但是无法随机访问任一元素)
7、循环链表的主要优点是(从表中任一结点出发都能访问到整个链表)
8、线性表(除了第一个和最后一个元素外,其余每个元素都有一个直接前驱和直接后继)
9、线性表的顺序存储结构和线性表的链式存储结构分别是(随机存取的存储结构、顺序存取的存储结构)
10、深度为5的满二叉树中,叶子结点的个数为(16)。其共有(31)个结点。
设一棵完全二叉树共有699个结点。则该二叉树的叶子结点数为(350)个。
#完全二叉树总的结点数为N,若N为奇数,则叶子结点数为(N+1)/2;若N为偶数,则叶子结点数为N/2。
11、具有3个结点的二叉树有(5)种形态。 #高度为2层的是:根-左-右。高度为3层的是:根-左-左、根-左-右、根-右-右、根-右-左。
12、一棵二叉树中有3个叶子结点,有8个度为1的结点,则该二叉树中总的结点数为(13)个。
#叶子结点数n0与度为2的结点数n2的关系是:n0=n2+1,所以度为2的结点个数为3-1=2。所以总的结点数为 n=n0+n1+n2, 8+2+3=13.
13、已知二叉树的后序遍历序列是dabec,中序遍历序列是debac,它的前序遍历序列是(cedba)。#过程见文章:点击打开链接
14、已知二叉树的前序遍历序列是abdgcefh,中序遍历序列是dgbaechf,它的前序遍历序列是(gdbehfca)。
15、算法是指(解决方案的准确而完整的描述)。
16、算法由(顺序、选择、循环)控制结构组合而成。
17、算法的时间复杂度是指(算法执行过程中所需要的基本运算次数)。
18、算法的空间复杂度是指(执行过程中所需要的存储空间)。
19、算法分析的目的是(分析算法的效率以求改进)。
20、数据的存储结构是指(数据的逻辑结构在计算机中的表示)。
21、数据的逻辑结构是指(反映数据元素之间逻辑关系的数据结构)。
22、根据数据结构中各元素之间前后件关系的复杂程度,可将数据结构分为(线性结构和非线性结构)。
线性结构一般是首无前驱,尾无后继,中间元素有唯一的前驱和后继。主要有:列表、链表、队列、栈。
非线性结构主要有1、没有对应关系的 集合。2、一对多关系的 树。3、多对多关系的 图。
23、(队列,循环队列,顺序表)不具有记忆功能,(栈)具有记忆功能。
24、递归算法一般需要用(栈)来实现。
#在递归算法的运行过程中,需要利用栈来保存其运算结果、参数和返回地址等。
25、算法的五个基本特征是:可行性,确定性,和拥有足够的情报
有限性:算法在执行有限步后必须终止。
确定性:算法的每个步骤都需要精确地定义,严格地、无歧义的运行。
输入:算法在运行之前赋给它的量。
输出:算法运行结束时的结果。
可行性:算法原则上能够精准地运行,而且人们用纸和笔做有限次运算后即可完成。
26、由两个栈共享一个存储空间的好处是(节省存储空间,降低上溢发生的概率)。
为了不发生上溢错误,就必须给每个栈分配一个足够大的存储空间。但实际中,很难准确地估计,若每个栈都分配过大的存储空间,势必造成系统空间紧张;若让多个栈共用一个足够大的连续存储空间,则可利用栈的动态特性使它们的存储空间互补
27、需要打印机输出数据时,一般将打印作业放在一个(队列)中。
28、非空的循环单链表head的尾结点(由 p 所指向) ,满足(p->next=head )。
29、与单链表相比,双向链表的优点是(更容易访问相邻结点)。
31、N个顶点的连通图中边的条数至少为(N-1)条。#将所有顶点连成一条线即可
32、N个顶点的强连通图中边的条数至少为(N)条。#将所有顶点连成一条圈
33、对长度为n的线性表进行顺序查找,最坏情况下需要比较(N)次。
34、最简单的交换排序是(冒泡排序)。
35、对长度为n的线性表进行顺序冒泡排序,最坏情况下需要比较(n(n-1)/2)次。
#一共比较n-1遍,第1遍需要比较n-1次,第1遍需要比较n-2次,........最后一遍需要比较1次。是一个等差序列,对其进行求和即可。
36、在序列基本有序的情况下,效率最高的方法是(A) #如果将插入排序换为冒泡排序,则选冒泡排序
A.插入排序 B.选择排序 C.快速排序 D.堆排序
插入排序通过数据元素的交换来逐步消除线性表中的逆序,所以比较的次数与初始排列次序有关,在待排序的元素序列基本有序的前提下,效率最高。而选择排序和堆排序的比较次数与初始排列次序无关。快速排序虽然与初始排列次序有关,但在待排序的元素序列基本有序的前提下,效率低于插入排序。
37、希尔排序属于(插入类排序),堆排序属于(选择类排序)。
38、在下列几种排序方法中,要求内存量最大的是(D).
A.插入排序 B.选择排序 C.快速排序 D.归并排序
快速排序的基本思想是,通过一趟排序将待排序记录分割成独的两部分,其中一部分记录的关键字均比另一部分记录的关键字小,再分别对这两部分记录继续进行排序,以达到整个序列有序;插入排序的基本操作是指将无序序列中的各元素依次插入到已经有序的线性表中,从而得到一个新的序列;选择排序的基本思想是:扫描整个线性表,从中选出最小的元素,将它交换到表的最前面(这是它应有的位置),然后对剩下的子表采用同样的方法,直到表空为止;归并排序是将两个或两个以上的有序表组成合成一个新的序列表。
39、已知数据表 A中每个元素距其最终位置不远,为节省时间, 应采用(直接插入排序)。
40、数据结构是指相互有关联的( 数据元素 )的集合。
41、数据元素之间的任何关系都可以用 (前驱和后继) 关系来描述。
42、顺序存储方法是把逻辑上相邻的结点存储在 (物理位置) 相邻的存储单元中。
43、栈的基本运算有三种:入栈、退栈与读栈顶元素。
44、队列主要有两种基本运算:入队和退队。
45、在实际应用中,带链的栈可以用来收集计算机存储空间中所有空闲的存储结点,这种带链的栈称为 (可利用栈) .
46、栈和队列通常采用的存储结构分别是 链式存储和顺序存储。
47、当循环队列非空且队尾指针等于对头指针时, 说明循环队列已满,不能进行入队运算。这种情况称为 (上溢)
48、当循环队列为空时, 不能进行退队运算, 这种情况称为 (下溢)。
49、在一个容量为 25 的循环队列中, 若头指针 front=16 , 尾指针 rear=9 , 则该循环队列中共有 18 个元素。
注: 当 rear<front 时, 元素个数=总容量-( front -rear ); 当 rear>front 时,元素个数= rear -front 。
50、判断一个链表是否存在环:点击打开此链接
单链表中元素的反转:点击打开此链接
判断两个数组中是否有相同的数字:点击打开此链接
从一个子序列中找出其最大子序列的和:点击打开此链接
按单词反转字符串:点击打开此链接
删除数组中重复的元素:点击打开此链接
算法部分:
1、排序算法:
排序可以算是最基本,最常用的算法,也是笔试面试中最常被考的算法,最基本的是冒泡排序,选择排序,插入排序要可以很快地用代码实现。这些主要考察你的实际编码能力。堆排序,归并排序,快速排序这些算法需要熟悉主要思想,和需要注意的细节地方。需要熟悉的常用排序算法的时间复杂度和空间复杂度。各种排序算法的使用范围:
(1)、当数据规模较小时候,可以使用简单的直接插入排序或者直接选择排序。
(2)、当文件的初态已经基本有序,可以用直接插入排序和冒泡排序。
(3)、当数据规模较大是,应用速度最快的排序算法,可以考虑使用快速排序。当记录随机分布的时候,快速排序平均时间最短,但是出现最坏的情况,这个时候的时间复杂度是O(n^2),且递归深度为n,所需的占空间为O(n)。
(4)、对排序不会出现快排那样最坏情况,且堆排序所需的辅助空间比快排要少,但是这两种算法都不是稳定的,要求排序时是稳定的,可以考虑用归并排序。
(5)、归并排序可以用于内部排序,也可以使用于排不排序。在外部排序时,通常采用多路归并,并且通过解决长顺串的合并,缠上长的初始串,提高主机与外设并行能力等,以减少访问外存额外次数,提高外排的效率。
2、查找算法
能够熟练写出或者上级编码出二分查找的程序。
3、hash算法
4、一些算法设计思想。贪心算法,分治算法,动态规划算法,随机划分算法,回溯算法等。这些可以根据具体的例子来复习。
5、STL
STL(Standard Templete Library)是一个C++领域中,用模板实现的数据结构和算法库,已经包含在了C++标准库中,其中的vector,list,stack,queue等结构不仅拥有更强大的功能,还有了更高的安全性。除了数据结构外,STL还包含了泛化的迭代器,和运行在迭代器至上的各种使用的算法。这些对于性能要求不是太高,但又不希望自己从底层实现算法的应用还是很具有诱惑力的。