数据结构面试题(含答案)

数据结构面试题(含答案)
数据结构面试题(含答案)

1.栈和队列的共同特点是(只允许在端点处插入和删除元素)

4.栈通常采用的两种存储结构是(线性存储结构和链表存储结构)

5.下列关于栈的叙述正确的是(D)

A.栈是非线性结构

B.栈是一种树状结构

C.栈具有先进先出的特征

D.栈有后进先出的特征

6.链表不具有的特点是(B)A.不必事先估计存储空间 B.可随机访问任一元素

C.插入删除不需要移动元素

D.所需空间与线性表长度成正比

7.用链表表示线性表的优点是(便于插入和删除操作)

8.在单链表中,增加头结点的目的是(方便运算的实现)

9.循环链表的主要优点是(从表中任一结点出发都能访问到整个链表)

10.线性表L=(a1,a2,a3,……ai,……an),下列说法正确的是(D)

A.每个元素都有一个直接前件和直接后件

B.线性表中至少要有一个元素

C.表中诸元素的排列顺序必须是由小到大或由大到小

D.除第一个和最后一个元素外,其余每个元素都有一个且只有一个直接前件和直接后件

11.线性表若采用链式存储结构时,要求内存中可用存储单元的地址(D)

A.必须是连续的

B.部分地址必须是连续的

C.一定是不连续的

D.连续不连续都可以

12.线性表的顺序存储结构和线性表的链式存储结构分别是(随机存取的存储结构、顺序存取的存储结构)

13.树是结点的集合,它的根结点数目是(有且只有1)

14.在深度为5的满二叉树中,叶子结点的个数为(31)

15.具有3个结点的二叉树有(5种形态)

16.设一棵二叉树中有3个叶子结点,有8个度为1的结点,则该二叉树中总的结点数为(13)

17.已知二叉树后序遍历序列是dabec,中序遍历序列是debac,它的前序遍历序列是(cedba)

18.已知一棵二叉树前序遍历和中序遍历分别为ABDEGCFH和DBGEACHF,则该二叉树的后序遍历为(DGEBHFCA)

19.若某二叉树的前序遍历访问顺序是abdgcefh,中序遍历访问顺序是dgbaechf,则其后序遍历的结点访问顺序是(gdbehfca)

20.数据库保护分为:安全性控制、完整性控制、并发性控制和数据的恢复。

1. 在计算机中,算法是指(解题方案的准确而完整的描述)

2.在下列选项中,哪个不是一个算法一般应该具有的基本特征(无穷性)

说明:算法的四个基本特征是:可行性、确定性、有穷性和拥有足够的情报。

3. 算法一般都可以用哪几种控制结构组合而成(顺序、选择、循环)

4.算法的时间复杂度是指(算法执行过程中所需要的基本运算次数)

5. 算法的空间复杂度是指(执行过程中所需要的存储空间)

6. 算法分析的目的是(分析算法的效率以求改进)

7. 下列叙述正确的是(C)

A.算法的执行效率与数据的存储结构无关

B.算法的空间复杂度是指算法程序中指令(或语句)的条数

C.算法的有穷性是指算法必须能在执行有限个步骤之后终止

D.算法的时间复杂度是指执行算法程序所需要的时间

8.数据结构作为计算机的一门学科,主要研究数据的逻辑结构、对各种数据结构进行的

运算,以及(数据的存储结构)

9. 数据结构中,与所使用的计算机无关的是数据的(C)

A.存储结构B.物理结构C.逻辑结构D.物理和存储结构

10. 下列叙述中,错误的是(B)

A.数据的存储结构与数据处理的效率密切相关

B.数据的存储结构与数据处理的效率无关

C.数据的存储结构在计算机中所占的空间不一定是连续的

D.一种数据的逻辑结构可以有多种存储结构

11. 数据的存储结构是指(数据的逻辑结构在计算机中的表示)

12. 数据的逻辑结构是指(反映数据元素之间逻辑关系的数据结构)

13. 根据数据结构中各数据元素之间前后件关系的复杂程度,一般将数据结构分为(线性结构和非线性结构)

14. 下列数据结构具有记忆功能的是(C)A.队列B.循环队列C.栈D.顺序表

15. 下列数据结构中,按先进后出原则组织数据的是(B)

A.线性链表B.栈C.循环链表D.顺序表

16. 递归算法一般需要利用(队列)实现。

17. 下列关于栈的叙述中正确的是(D)A.在栈中只能插入数据B.在栈中只能删除数据

C.栈是先进先出的线性表D.栈是先进后出的线性表

20. 由两个栈共享一个存储空间的好处是(节省存储空间,降低上溢发生的机率)

21. 应用程序在执行过程中,需要通过打印机输出数据时,一般先形成一个打印作业,将其存放在硬盘中的一个指定(队列)中,当打印机空闲时,就会按先来先服务的方式从中取出待打印的作业进行打印。

22.下列关于队列的叙述中正确的是(C)A.在队列中只能插入数据B.在队列中只能删除数据C.队列是先进先出的线性表D.队列是先进后出的线性表

23.下列叙述中,正确的是(D)A.线性链表中的各元素在存储空间中的位置必须是连续的

B.线性链表中的表头元素一定存储在其他元素的前面C.线性链表中的各元素在存储空间中的位置不一定是连续的,但表头元素一定存储在其他元素的前面D.线性链表中的各元素在存储空间中的位置不一定是连续的,且各元素的存储顺序也是任意的24.下列叙述中正确的是(A)A.线性表是线性结构B.栈与队列是非线性结构C.线性链表是非线性结构D.二叉树是线性结构

25. 线性表L=(a1,a2,a3,……ai,……an),下列说法正确的是(D)

A.每个元素都有一个直接前件和直接后件B.线性表中至少要有一个元素

C.表中诸元素的排列顺序必须是由小到大或由大到小D.除第一个元素和最后一个元素外,其余每个元素都有一个且只有一个直接前件和直接后件

26.线性表若采用链式存储结构时,要求内存中可用存储单元的地址(连续不连续都可以)

27. 链表不具有的特点是(B)A.不必事先估计存储空间B.可随机访问任一元素

C.插入删除不需要移动元素D.所需空间与线性表长度成正比

28. 非空的循环单链表head的尾结点(由p所指向),满足(p->next=head)

29.与单向链表相比,双向链表的优点之一是(更容易访问相邻结点)

30. 在(D)中,只要指出表中任何一个结点的位置,就可以从它出发依次访问到表中

其他所有结点。A.线性单链表B.双向链表C.线性链表D.循环链表

31. 以下数据结构属于非线性数据结构的是(C)A.队列B.线性表C.二叉

树D.栈

32.树是结点的集合,它的根结点数目是(有且只有1)

33.具有3个结点的二叉树有(5种形态)

34. 在一棵二叉树上第8层的结点数最多是(128)注:2K-1

35. 在深度为5的满二叉树中,叶子结点的个数为(16)注:2n-1

36. 在深度为5的满二叉树中,共有(31)个结点。注:2n-1

37.设一棵完全二叉树共有699个结点,则在该二叉树中的叶子结点数为(350)

说明:完全二叉树总结点数为N,若N为奇数,则叶子结点数为(N+1)/2;若N为偶数,则叶子结点数为N/2。

38. 设有下列二叉树,对此二叉树中序遍历的结果是(B)

A.ABCDEF

B.DBEAFC

C.ABDECF

D.DEBFCA

39.已知二叉树后序遍历序列是dabec,中序遍历序列debac,它的前序遍历序列是(cedba)

40. 已知一棵二叉树前序遍历和中序遍历分别为ABDEGCFH和DBGEACHF,则该二叉树的后序遍历为(DGEBHFCA)

41.若某二叉树的前序遍历访问顺序是abdgcefh,中序遍历访问顺序是dgbaechf,则其后序遍历的结点访问顺序是(gdbehfca)

42. 串的长度是(串中所含字符的个数)

43.设有两个串p和q,求q在p中首次出现位置的运算称做(模式匹配)

44. N个顶点的连通图中边的条数至少为(N-1)

45.N个顶点的强连通图的边数至少有(N)

46.对长度为n的线性表进行顺序查找,在最坏情况下所需要的比较次数为(N)

47. 最简单的交换排序方法是(冒泡排序)

48.假设线性表的长度为n,则在最坏情况下,冒泡排序需要的比较次数为(n(n-1)/2)

49. 在待排序的元素序列基本有序的前提下,效率最高的排序方法是(冒泡排序)

50. 在最坏情况下,下列顺序方法中时间复杂度最小的是(堆排序)

51. 希尔排序法属于(插入类排序)

52. 堆排序法属于(选择类排序)

53. 在下列几种排序方法中,要求内存量最大的是(归并排序)

54. 已知数据表A中每个元素距其最终位置不远,为节省时间,应采用(直接插入排序)

55. 算法的基本特征是可行性、确定性、有穷性和拥有足够的情报。

1.一个算法通常由两种基本要素组成:一是对数据对象的运算和操作,二是算法的控制结构。

1. 算法的复杂度主要包括时间复杂度和空间复杂度。

2. 实现算法所需的存储单元多少和算法的工作量大小分别称为算法的空间复杂度和时间复杂度。

3.所谓数据处理是指对数据集合中的各元素以各种方式进行运算,包括插入、删除、查找、更改等运算,也包括对数据元素进行分析。

4.数据结构是指相互有关联的数据元素的集合。

5.数据结构分为逻辑结构与存储结构,线性链表属于存储结构。

6.数据结构包括数据的逻辑结构和数据的存储结构。

7. 数据结构包括数据的逻辑结构、数据的存储结构以及对数据的操作运算。

8.数据元素之间的任何关系都可以用前趋和后继关系来描述。

9.数据的逻辑结构有线性结构和非线性结构两大类。

10.常用的存储结构有顺序、链接、索引等存储结构。

11. 顺序存储方法是把逻辑上相邻的结点存储在物理位置相邻的存储单元中。

12. 栈的基本运算有三种:入栈、退栈与读栈顶元素。

13. 队列主要有两种基本运算:入队运算与退队运算。

14. 在实际应用中,带链的栈可以用来收集计算机存储空间中所有空闲的存储结点,这种带链的栈称为可利用栈。

15.栈和队列通常采用的存储结构是链式存储和顺序存储。

16.当线性表采用顺序存储结构实现存储时,其主要特点是逻辑结构中相邻的结点在存储结构中仍相邻。

17. 循环队列主要有两种基本运算:入队运算与退队运算。每进行一次入队运算,队尾指针就进1 。

18.当循环队列非空且队尾指针等于对头指针时,说明循环队列已满,不能进行入队运算。这种情况称为上溢。

19.当循环队列为空时,不能进行退队运算,这种情况称为下溢。

20. 在一个容量为25的循环队列中,若头指针front=16,尾指针rear=9,则该循环队列中共有18 个元素。注:当rear

当rear>front时,元素个数=rear-front。

1.判断链表是否存在环型链表问题:判断一个链表是否存在环,例如下面这个链表就存在一个环:

例如N1->N2->N3->N4->N5->N2就是一个有环的链表,环的开始结点是N5这里有一个比较简单的解法。设置两个指针p1,p2。每次循环p1向前走一步,p2向前走两步。直到p2碰到NULL指针或者两个指针相等结束循环。如果两个指针相等则说明存在环。struct link

{

int data;

link* next;

};

bool IsLoop(link* head)

{

link* p1=head, *p2 = head;

if (head ==NULL || head->next ==NULL)

{

return false;

}

do{

p1= p1->next;

p2 = p2->next->next;

} while(p2 && p2->next && p1!=p2);

if(p1 == p2)

return true;

else

return false;

}

2,链表反转单向链表的反转是一个经常被问到的一个面试题,也是一个非常基础的问题。比如一个链表是这样的:1->2->3->4->5 通过反转后成为5->4->3->2->1。最容易想到的方法遍历一遍链表,利用一个辅助指针,存储遍历过程中当前指针指向的下一个元素,然后将当前节点元素的指针反转后,利用已经存储的指针往后面继续遍历。源代码如下:

struct linka {

int data;

linka* next;

};

void reverse(linka*& head)

{

if(head ==NULL)

return;

linka*pre, *cur, *ne;

pre=head;

cur=head->next;

while(cur)

{

ne = cur->next;

cur->next = pre;

pre = cur;

cur = ne;

}

head->next = NULL;

head = pre;

}

还有一种利用递归的方法。这种方法的基本思想是在反转当前节点之前先调用递归函数反转后续节点。源代码如下。不过这个方法有一个缺点,就是在反转后的最后一个结点会形成一个环,所以必须将函数的返回的节点的next域置为NULL。因为要改变head 指针,所以我用了引用。算法的源代码如下:

linka* reverse(linka* p,linka*& head)

{

if(p == NULL || p->next == NULL)

{

head=p;

return p;

}

else

{

linka* tmp = reverse(p->next,head);

tmp->next = p;

return p;

}

}

3,判断两个数组中是否存在相同的数字给定两个排好序的数组,怎样高效得判断这两个数组中存在相同的数字?

这个问题首先想到的是一个O(nlogn)的算法。就是任意挑选一个数组,遍历这个数组的所有元素,遍历过程中,在另一个数组中对第一个数组中的每个元素进行binary search。用C++实现代码如下:

bool findcommon(int a[],int size1,int b[],int size2)

{

int i;

for(i=0;i

{

int start=0,end=size2-1,mid;

while(start<=end)

{

mid=(start+end)/2;

if(a[i]==b[mid])

return true;

else if (a[i]

end=mid-1;

else

start=mid+1;

}

}

return false;

}

后来发现有一个O(n)算法。因为两个数组都是排好序的。所以只要一次遍历就行了。首先设两个下标,分别初始化为两个数组的起始地址,依次向前推进。推进的规则是比较两个数组中的数字,小的那个数组的下标向前推进一步,直到任何一个数组的下标到达数组末尾时,如果这时还没碰到相同的数字,说明数组中没有相同的数字。

bool findcommon2(int a[], int size1, int b[], int size2)

{

int i=0,j=0;

while(i

{

if(a[i]==b[j])

return true;

if(a[i]>b[j])

j++;

if(a[i]

i++;

}

return false;

}

4,最大子序列问题:

给定一整数序列A1,A2,... An (可能有负数),求A1~An的一个子序列Ai~Aj,使得Ai到Aj的和最大

例如:

整数序列-2, 11, -4, 13, -5, 2, -5, -3, 12, -9的最大子序列的和为21。

对于这个问题,最简单也是最容易想到的那就是穷举所有子序列的方法。利用三重循环,依次求出所有子序列的和然后取最大的那个。当然算法复杂度会达到O(n^3)。显然这种方法不是最优的,下面给出一个算法复杂度为O(n)的线性算法实现,算法的来源于Programming Pearls一书。在给出线性算法之前,先来看一个对穷举算法进行优化的算法,它的算法复杂度为O(n^2)。其实这个算法只是对对穷举算法稍微做了一些修改:其实子序列的和我们并不需要每次都重新计算一遍。假设Sum(i, j)是A[i] ... A[j]的和,那么Sum(i, j+1) = Sum(i, j) + A[j+1]。利用这一个递推,我们就可以得到下面这个算法:int max_sub(int a[],int size)

{

int i,j,v,max=a[0];

for(i=0;i

{

v=0;

for(j=i;j

{

v=v+a[j];//Sum(i, j+1) = Sum(i, j) + A[j+1]

if(v>max)

max=v;

}

}

return max;

}

那怎样才能达到线性复杂度呢?这里运用动态规划的思想。先看一下源代码实现:

int max_sub2(int a[], int size)

{

int i,max=0,temp_sum=0;

for(i=0;i

{

temp_sum+=a[i];

if(temp_sum>max)

max=temp_sum;

else if(temp_sum<0)

temp_sum=0;

}

return max;

6,按单词反转字符串并不是简单的字符串反转,而是按给定字符串里的单词将字符串倒转过来,就是说字符串里面的单词还是保持原来的顺序,这里的每个单词用空格分开。例如:

Here is https://www.360docs.net/doc/605477718.html,

经过反转后变为:

https://www.360docs.net/doc/605477718.html, is Here

如果只是简单的将所有字符串翻转的话,可以遍历字符串,将第一个字符和最后一个交换,第二个和倒数第二个交换,依次循环。其实按照单词反转的话可以在第一遍遍历的基础上,再遍历一遍字符串,对每一个单词再反转一次。这样每个单词又恢复了原来的顺序。

char* reverse_word(const char* str)

{

int len = strlen(str);

char* restr = new char[len+1];

strcpy(restr,str);

int i,j;

for(i=0,j=len-1;i

{

char temp=restr[i];

restr[i]=restr[j];

restr[j]=temp;

}

int k=0;

while(k

{

i=j=k;

while(restr[j]!=' ' && restr[j]!='' )

j++;

k=j+1;

j--;

for(;i

{

char temp=restr[i];

restr[i]=restr[j];

restr[j]=temp;

}

}

return restr;

如果考虑空间和时间的优化的话,当然可以将上面代码里两个字符串交换部分改为异或实现。

例如将

char temp=restr[i];

restr[i]=restr[j];

restr[j]=temp;

改为

restr[i]^=restr[j];

restr[j]^=restr[i];

restr[i]^=restr[j];

7,字符串反转我没有记错的话是一道MSN的笔试题,网上无意中看到的,拿来做了一下。题目是这样的,给定一个字符串,一个这个字符串的子串,将第一个字符串反转,但保留子串的顺序不变。例如:

输入:第一个字符串: "This is fishsky 's Chinese site: https://www.360docs.net/doc/605477718.html,/cn"

子串: "fishsky"

输出:"nc/nc.moc.fishsky.www//:ptth :etis esenihC s'fishsky si sihT"

一般的方法是先扫描一边第一个字符串,然后用stack把它反转,同时记录下子串出现的位置。然后再扫描一遍把记录下来的子串再用stack反转。我用的方法是用一遍扫描数组的方法。扫描中如果发现子串,就将子串倒过来压入堆栈。

最后再将堆栈里的字符弹出,这样子串又恢复了原来的顺序。源代码如下:

#include

#include

#include

using namespace std;

//reverse the string 's1' except the substring 'token'.

const char* reverse(const char* s1, const char* token)

{

assert(s1 && token);

stack stack1;

const char* ptoken = token, *head = s1, *rear = s1;

while (*head != '')

{

while(*head!= '' && *ptoken == *head)

{

ptoken++;

head++;

}

if(*ptoken == '')//contain the token

{

const char* p;

for(p=head-1;p>=rear;p--)

stack1.push(*p);

ptoken = token;

rear = head;

}

else

{

stack1.push(*rear);

head=++rear;

ptoken = token;

}

}

char * return_v = new char[strlen(s1)+1];

int i=0;

while(!stack1.empty())

{

return_v[i++] = stack1.top();

stack1.pop();

}

return_v[i]='';

return return_v;

}

int main(int argc, char* argv[])

{cout<<"This is fishsky 's Chinese site: https://www.360docs.net/doc/605477718.html,/cn

";

cout<

return 0;

}

8, 删除数组中重复的数字问题:一个动态长度可变的数字序列,以数字0为结束标志,要求将重复的数字用一个数字代替,例如:

将数组1,1,1,2,2,2,2,2,7,7,1,5,5,5,0 转变成1,2,7,1,5,0 问题比较简单,要注意的是这个数组是动态的。所以避免麻烦我还是用了STL的vector。

#include

#include

using namespace std;

//remove the duplicated numbers in an intger array, the array was end with 0;

//e.g. 1,1,1,2,2,5,4,4,4,4,1,0 --->1,2,5,4,1,0

void static remove_duplicated(int a[], vector& _st)

{

_st.push_back(a[0]);

for(int i=1;_st[_st.size()-1]!=0;i++)

{

if(a[i-1]!=a[i])

_st.push_back(a[i]);

}

}

当然如果可以改变原来的数组的话,可以不用STL,仅需要指针操作就可以了。下面这个程序将修改原来数组的内容。

void static remove_duplicated2(int a[])

{

if(a[0]==0 || a==NULL)

return;

int insert=1,current=1;

while(a[current]!=0)

{

if(a[current]!=a[current-1])

{

a[insert]=a[current];

insert++;

current++;

}

else

current++;

}

a[insert]=0;

}

9,如何判断一棵二叉树是否是平衡二叉树问题:判断一个二叉排序树是否是平衡二叉树解决方案:

根据平衡二叉树的定义,如果任意节点的左右子树的深度相差不超过1,那这棵树就是平衡二叉树。

首先编写一个计算二叉树深度的函数,利用递归实现。

template

static int Depth(BSTreeNode* pbs)

{

if (pbs==NULL)

return 0;

else

{

int ld = Depth(pbs->left);

int rd = Depth(pbs->right);

return 1 + (ld >rd ? ld : rd);

}

}

下面是利用递归判断左右子树的深度是否相差1来判断是否是平衡二叉树的函数:template

static bool isBalance(BSTreeNode* pbs)

{

if (pbs==NULL)

return true;

int dis = Depth(pbs->left) - Depth(pbs->right);

if (dis>1 || dis<-1 )

return false;

else

return isBalance(pbs->left) && isBalance(pbs->right);

4.abstract class Something {

private abstract String doSomething ();

}

该段代码有错吗?

答案: 错。abstract的methods不能以private修饰。abstract的methods就是让子类implement(实现)具体细节的,怎么可以用private把abstract method封锁起来呢? (同理,abstract method前不能加final)。

5.看看下面的代码段错在哪里?

public class Something {

void doSomething () {

private String s = "";

int l = s.length();

}

}

答案: 错。局部变量前不能放置任何访问修饰符(private,public,和protected)。final可以用来修饰局部变量

(final如同abstract和strictfp,都是非访问修饰符,strictfp只能修饰class和method而非variable)。

6. 下面该段代码是否有错,若是有错错在哪里?

abstract class Name {

private String name;

public abstract boolean isStupidName(String name) {}

}

答案: 错。abstract method必须以分号结尾,且不带花括号。

数据结构常见笔试题

1.栈和队列的共同特点是(只允许在端点处插入和删除元素) 2.栈通常采用的两种存储结构是(线性存储结构和链表存储结构) 3.链表不具有的特点是(B) A.不必事先估计存储空间 B.可随机访问任一元素 C.插入删除不需要移动元素 D.所需空间与线性表长度成正比 4.用链表表示线性表的优点是(便于插入和删除操作) 5.在单链表中,增加头结点的目的是(方便运算的实现) 6.循环链表的主要优点是(从表中任一结点出发都能访问到整个链表) 7.线性表若采用链式存储结构时,要求内存中可用存储单元的地址(D) A.必须是连续的 B.部分地址必须是连续的 C.一定是不连续的 D.连续不连续都可以 8.线性表的顺序存储结构和线性表的链式存储结构分别是(随机存取的存储结构、顺序存取的存储结构) 9.具有3个结点的二叉树有(5种形态) 10.设一棵二叉树中有3个叶子结点,有8个度为1的结点,则该二叉树中总的 结点数为(13)(n 0 = n 2 +1) 11.已知二叉树后序遍历序列是dabec,中序遍历序列是debac,它的前序遍历序列是(cedba) 12.若某二叉树的前序遍历访问顺序是abdgcefh,中序遍历访问顺序是dgbaechf,则其后序遍历的结点访问顺序是(gdbehfca) 13.数据库保护分为:安全性控制、完整性控制、并发性控制和数据的恢复。

1.在计算机中,算法是指(解题方案的准确而完整的描述) 2.算法一般都可以用哪几种控制结构组合而成(顺序、选择、循环) 3.算法的时间复杂度是指(算法执行过程中所需要的基本运算次数) 4.算法的空间复杂度是指(执行过程中所需要的存储空间) 5.算法分析的目的是(分析算法的效率以求改进) 6.下列叙述正确的是(C) A.算法的执行效率与数据的存储结构无关 B.算法的空间复杂度是指算法程序中指令(或语句)的条数 C.算法的有穷性是指算法必须能在执行有限个步骤之后终止 D.算法的时间复杂度是指执行算法程序所需要的时间 7.数据结构作为计算机的一门学科,主要研究数据的逻辑结构、对各种数据结构进行的运算,以及(数据的存储结构) 8.数据结构中,与所使用的计算机无关的是数据的(C) A.存储结构 B.物理结构 C.逻辑结构 D.物理和存储结构 9.下列叙述中,错误的是(B) A.数据的存储结构与数据处理的效率密切相关 B.数据的存储结构与数据处理的效率无关 C.数据的存储结构在计算机中所占的空间不一定是连续的 D.一种数据的逻辑结构可以有多种存储结构 10.数据的存储结构是指(数据的逻辑结构在计算机中的表示) 11.数据的逻辑结构是指(反映数据元素之间逻辑关系的数据结构) 12.根据数据结构中各数据元素之间前后件关系的复杂程度,一般将数据结构分为(线性结构和非线性结构) 13.下列数据结构具有记忆功能的是(C) A.队列 B.循环队列 C.栈 D.顺序表 14.递归算法一般需要利用(栈)实现。 15.由两个栈共享一个存储空间的好处是(节省存储空间,降低上溢发生的机率)

腾讯校园招聘数据结构笔试试题

腾讯校园招聘数据结构笔试试题 (一)不定项选择题(25*4) 1. 使用深度优先算法遍历下图,遍历的顺序为() A ABCDEFG B ABDCFEG C ABDECFG D ABCDFEG 2. 输入序列ABCABC经过栈操作变成ABCCBA,下面哪些是可能的栈操作( ) A. push pop push pop push pop pushpush push pop pop pop B. push push push push push push poppop pop pop pop pop C. push push push pop pop pop pushpush pop pop push pop D. push push push push pop pushpop push pop pop pop pop 3. 下列关键码序列哪些是一个堆( ) A. 90 31 53 23 16 48 B 90 48 31 53 16 23 C 16 53 23 90 3148 D.1631 23 90 53 48 4. 稀疏矩阵压缩的存储方法是:() A 三元组 B 二维数组 C 散列 D 十字链表 5. 二叉树的后序排列DBEFCA,中序排列DBAECF,那么对其做先序线索化二叉树,节点E的线索化指向节点() A BC B A C C DF D CF 6. 线性结构的是() A 串 B 链式存储栈C顺序存储栈 D 顺序存储二叉树 7. Linux命令是哪些() A ls B mkdir Cmagnify D man 8. Unix系统中,适合任意两个进程通信的是() A FIFO B PIPE C Message Queue D sharememory 9. Windows系统中,不适合进程通讯的是() A 临界区 B 互斥量 C 信号量 D 事件 10. 下面的内存管理模式中,会产生外零头的是() A 页式 B段式C 请求页式 D 请求段式 11. Linux执行ls,会引起哪些系统调用() A nmap B read C execve D fork 12. a 是二维数组,a[j]的指针访问方式为:() A *(a+i+j) B *(*(a+i)+j) C *(a+i)+j D *a+i+j 13 输出以下结果: #define add(a,b) a+b;

数据结构面试专题

数据结构面试专题 1、常用数据结构简介 数据结构是指相互之间存在着一种或多种关系的数据元素的集合和该集合中数据元素间的关系组成。常用的数据有:数组、栈、队列、链表、树、图、堆、散列表。 1)数组:在内存中连续存储多个元素的结构。数组元素通过下标访问,下标从0开始。优点:访问速度快;缺点:数组大小固定后无法扩容,只能存储一种类型的数据,添加删除操作慢。适用场景:适用于需频繁查找,对存储空间要求不高,很少添加删除。 2)栈:一种特殊的线性表,只可以在栈顶操作,先进后出,从栈顶放入元素叫入栈,从栈顶取出元素叫出栈。应用场景:用于实现递归功能,如斐波那契数列。 3)队列:一种线性表,在列表一端添加元素,另一端取出,先进先出。使用场景:多线程阻塞队列管理中。 4)链表:物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表的指针地址实现,每个元素包含两个结点,一个是存储元素的数据域,一个是指向下一个结点地址的指针域。有单链表、双向链表、循环链表。优点:可以任意加减元素,不需要初始化容量,添加删除元素只需改变前后两个元素结点的指针域即可。缺点:因为含有大量指针域,固占用空间大,查找耗时。适用场景:数据量小,需频繁增加删除操作。 5)树:由n个有限节点组成一种具有层次关系的集合。二叉树(每个结点最多有两个子树,结点的度最大为2,左子树和右子树有顺序)、红黑树(HashMap底层源码)、B+树(mysql 的数据库索引结构) 6)散列表(哈希表):根据键值对来存储访问。 7)堆:堆中某个节点的值总是不大于或不小于其父节点的值,堆总是一棵完全二叉树。8)图:由结点的有穷集合V和边的集合E组成。 2、并发集合了解哪些? 1)并发List,包括Vector和CopyOnWriteArrayList是两个线程安全的List,Vector读写操作都用了同步,CopyOnWriteArrayList在写的时候会复制一个副本,对副本写,写完用副本替换原值,读时不需要同步。 2)并发Set,CopyOnWriteArraySet基于CopyOnWriteArrayList来实现的,不允许存在重复的对象。 3)并发Map,ConcurrentHashMap,内部实现了锁分离,get操作是无锁的。

经典数据结构面试题(含答案)

.栈通常采用的两种存储结构是______________________ .用链表表示线性表的优点是_______________________ 8.在单链表中,增加头结点的目的是___________________ 9.循环链表的主要优点是________________________- 12.线性表的顺序存储结构和线性表的链式存储结构分别是__________________________ 13.树是结点的集合,它的根结点数目是_____________________ 14.在深度为5的满二叉树中,叶子结点的个数为_______________ 15.具有3个结点的二叉树有(_____________________ 16.设一棵二叉树中有3个叶子结点,有8个度为1的结点,则该二叉树中总的结点数为____________________ 17.已知二叉树后序遍历序列是dabec,中序遍历序列是debac,它的前序遍历序列是____________________________ 18.已知一棵二叉树前序遍历和中序遍历分别为ABDEGCFH和DBGEACHF,则该二叉树的后序遍历为______________________ 19.若某二叉树的前序遍历访问顺序是abdgcefh,中序遍历访问顺序是dgbaechf,则其后序遍历的结点访问顺序是_______________________ 20.数据库保护分为:安全性控制、完整性控制、并发性控制和数据的恢复。 在计算机中,算法是指_______________________ 算法一般都可以用哪几种控制结构组合而成_____________________ .算法的时间复杂度是指______________________ 5. 算法的空间复杂度是指__________________________ 6. 算法分析的目的是__________________________

SQL数据库面试题目及其答案

1.触发器的作用? 答: 触发器是一中特殊的存储过程,主要是通过事件来触发而被执行的。 它可以强化约束,来维护数据的完整性和一致性,可以跟踪数据库内的操作从而不允许未经许可的更新和变化。可以联级运算。如,某表上的触发器上包含对另一个表的数据操作,而该操作又会导致该表触发器被触发。 2.什么是存储过程?用什么来调用? 答: 存储过程是一个预编译的SQL语句,优点是允许模块化的设计,就是说只需创建一次,以后在该程序中就可以调用多次。如果某次操作需要执行多次SQL,使用存储过程比单纯SQL语句执行要快。可以用一个命令对象来调用存储过程。 3.索引的作用?和它的优点缺点是什么? 答: 索引就一种特殊的查询表,数据库的搜索引擎可以利用它加速对数据的检索。它很类似与现实生活中书的目录,不需要查询整本书内容就可以找到想要的数据。索引可以是唯一的,创建索引允许指定单个列或者是多个列。 缺点是它减慢了数据录入的速度,同时也增加了数据库的尺寸大小。 3。什么是内存泄漏? 答: 一般我们所说的内存泄漏指的是堆内存的泄漏。堆内存是程序从堆中为其分配的,大小任意的,使用完后要显示释放内存。当应用程序用关键字new等创建对象时,就从堆中为它分配一块内存,使用完后程序调用free或者delete 释放该内存,否则就说该内存就不能被使用,我们就说该内存被泄漏了。

4.维护数据库的完整性和一致性,你喜欢用触发器还是自写业务逻辑?为什 么? 答: 我是这样做的,尽可能使用约束,如check,主键,外键,非空字段等来约束,这样做效率最高,也最方便。其次是使用触发器,这种方法可以保证,无论什么业务系统访问数据库都可以保证数据的完整新和一致性。最后考虑的是自写业务逻辑,但这样做麻烦,编程复杂,效率低下。 5.什么是事务?什么是锁? 答: 事务就是被绑定在一起作为一个逻辑工作单元的SQL语句分组,如果任何一个语句操作失败那么整个操作就被失败,以后操作就会回滚到操作前状态,或者是上有个节点。为了确保要么执行,要么不执行,就可以使用事务。 要将有组语句作为事务考虑,就需要通过ACID测试,即原子性,一致性,隔离性和持久性。 锁: 在所以的DBMS中,锁是实现事务的关键,锁可以保证事务的完整性和并发性。与现实生活中锁一样,它可以使某些数据的拥有者,在某段时间内不能使用某些数据或数据结构。当然锁还分级别的。 6."什么叫视图?游标是什么? 答: 视图是一种虚拟的表,具有和物理表相同的功能。可以对视图进行增,改,查,操作,试图通常是有一个表或者多个表的行或列的子集。对视图的修改不影响基本表。它使得我们获取数据更容易,相比多表查询。 游标:

经典数据结构面试题(含答案)

栈和队列的共同特点是__________________________ .栈通常采用的两种存储结构是______________________ .用链表表示线性表的优点是_______________________ 8.在单链表中,增加头结点的目的是___________________ 9.循环链表的主要优点是________________________- 12.线性表的顺序存储结构和线性表的链式存储结构分别是 __________________________ 13.树是结点的集合,它的根结点数目是_____________________ 14.在深度为5的满二叉树中,叶子结点的个数为_______________ 15.具有3个结点的二叉树有(_____________________ 16.设一棵二叉树中有3个叶子结点,有8个度为1的结点,则该二叉树中总的结点数为____________________ 17.已知二叉树后序遍历序列是dabec,中序遍历序列是debac,它的前序遍历序列是 ____________________________ 18.已知一棵二叉树前序遍历和中序遍历分别为ABDEGCFH和DBGEACHF,则该二叉树的后序遍历为______________________ 19.若某二叉树的前序遍历访问顺序是abdgcefh,中序遍历访问顺序是dgbaechf,则其后序遍历的结点访问顺序是_______________________ 20.数据库保护分为:安全性控制、完整性控制、并发性控制和数据的恢复。 在计算机中,算法是指_______________________ 算法一般都可以用哪几种控制结构组合而成_____________________ .算法的时间复杂度是指______________________ 5. 算法的空间复杂度是指__________________________ 6. 算法分析的目的是__________________________

[第1题-60题汇总]微软数据结构+算法面试100题

精选微软等公司数据结构 精选微软等公司数据结构++算法面试100题 -----[第1题-60题总] 资源说明: 此份,是为微软等公司数据结构+算法面试100题,之前60题的汇总。 总结整理了前第1题-第60题。特此并作此一份上传。以飨各位。:)。 -------------------------------- 相关资源,包括答案,下载地址: [答案V0.2版]精选微软数据结构+算法面试100题[前20题]--答案修正 https://www.360docs.net/doc/605477718.html,/source/2813890 //此份答案是针对最初的V0.1版本,进行的校正与修正。 [答案V0.1版]精选微软数据结构+算法面试100题[前25题] https://www.360docs.net/doc/605477718.html,/source/2796735 [第二部分]精选微软等公司结构+算法面试100题[前41-60题]: https://www.360docs.net/doc/605477718.html,/source/2811703 [第一部分]精选微软等公司数据结构+算法经典面试100题[1-40题] https://www.360docs.net/doc/605477718.html,/source/2778852 更多资源,下载地址: http://v_july_https://www.360docs.net/doc/605477718.html,/ 很快,我将公布第21-40题的答案,敬请期待。:).. 如果你对以下的前第1-60题,有好的思路,和算法,欢迎跟帖回复, 或者,联系我,发至我的邮箱, zhoulei0907@https://www.360docs.net/doc/605477718.html,。 My CSDN Blog:https://www.360docs.net/doc/605477718.html,/v_JULY_v My sina Blog:https://www.360docs.net/doc/605477718.html,/shitou009 帖子维护地址: [整理]算法面试:精选微软经典的算法面试100题[前1-60题] https://www.360docs.net/doc/605477718.html,/u/20101023/20/5652ccd7-d510-4c10-9671-307a56006e6d.html -------------------------------------- July、2010、/11.12.请享用。:)。 1

算法大全-面试题-数据结构

一、单链表 目录 1.单链表反转 2.找出单链表的倒数第4个元素 3.找出单链表的中间元素 4.删除无头单链表的一个节点 5.两个不交叉的有序链表的合并 6.有个二级单链表,其中每个元素都含有一个指向一个单链表的指针。写程序把这个二级链表称一级单链表。 7.单链表交换任意两个元素(不包括表头) 8.判断单链表是否有环?如何找到环的“起始”点?如何知道环的长度? 9.判断两个单链表是否相交 10.两个单链表相交,计算相交点 11.用链表模拟大整数加法运算 12.单链表排序 13.删除单链表中重复的元素 首先写一个单链表的C#实现,这是我们的基石: public class Link { public Link Next; public string Data; public Link(Link next, string data) { this.Next = next; this.Data = data; } } 其中,我们需要人为地在单链表前面加一个空节点,称其为head。例如,一个单链表是1->2->5,如图所示: 对一个单链表的遍历如下所示: static void Main(string[] args) { Link head = GenerateLink(); Link curr = head; while (curr != null)

{ Console.WriteLine(curr.Data); curr = curr.Next; } } 1.单链表反转 这道题目有两种算法,既然是要反转,那么肯定是要破坏原有的数据结构的:算法1:我们需要额外的两个变量来存储当前节点curr的下一个节点next、再下一个节点nextnext: public static Link ReverseLink1(Link head) { Link curr = head.Next; Link next = null; Link nextnext = null; //if no elements or only one element exists if (curr == null || curr.Next == null) { return head; } //if more than one element while (curr.Next != null) { next = curr.Next; //1 nextnext = next.Next; //2 next.Next = head.Next; //3 head.Next = next; //4 curr.Next = nextnext; //5 } return head; } 算法的核心是while循环中的5句话 我们发现,curr始终指向第1个元素。 此外,出于编程的严谨性,还要考虑2种极特殊的情况:没有元素的单链表,以及只有一个元素的单链表,都是不需要反转的。

2021年经典数据结构面试题含答案

栈和队列共同特点是__________________________ .栈普通采用两种存储构造是______________________ .用链表表达线性表长处是_______________________ 8.在单链表中,增长头结点目是___________________ 9.循环链表重要长处是________________________- 12.线性表顺序存储构造和线性表链式存储构造分别是__________________________ 13.树是结点集合,它根结点数目是_____________________ 14.在深度为5满二叉树中,叶子结点个数为_______________ 15.具备3个结点二叉树有(_____________________ 16.设一棵二叉树中有3个叶子结点,有8个度为1结点,则该二叉树中总结点数为 ____________________ 17.已知二叉树后序遍历序列是dabec,中序遍历序列是debac,它前序遍历序列是 ____________________________ 18.已知一棵二叉树前序遍历和中序遍历分别为ABDEGCFH和DBGEACHF,则该二叉树后序遍历为______________________

19.若某二叉树前序遍历访问顺序是abdgcefh,中序遍历访问顺序是dgbaechf,则其后序遍历结点访问顺序是_______________________ 20.数据库保护分为:安全性控制、完整性控制、并发性控制和数据恢复。 在计算机中,算法是指_______________________ 算法普通都可以用哪几种控制构造组合而成_____________________ .算法时间复杂度是指______________________ 5. 算法空间复杂度是指__________________________ 6. 算法分析目是__________________________ 11. 数据存储构造是指_________________________ 12. 数据逻辑构造是指(_______________________________ 13. 依照数据构造中各数据元素之间先后件关系复杂限度,普通将数据构造分为 __________________________________ 16. 递归算法普通需要运用_______________________实现。

经典数据结构面试题(含答案)

栈与队列得共同特点就是__________________________ 、栈通常采用得两种存储结构就是______________________ 、用链表表示线性表得优点就是_______________________ 8、在单链表中,增加头结点得目得就是___________________ ?9、循环链表得主要优点就是________________________- 12、线性表得顺序存储结构与线性表得链式存储结构分别就是__________________________ 13、树就是结点得集合,它得根结点数目就是_____________________ 14、在深度为5得满二叉树中,叶子结点得个数为_______________ ?15、具有3个结点得二叉树有(_____________________ 16、设一棵二叉树中有3个叶子结点,有8个度为1得结点,则该二叉树中总得结点数为____________________ 17、已知二叉树后序遍历序列就是dabec,中序遍历序列就是debac,它得前序遍历序列就是____________________________ 18、已知一棵二叉树前序遍历与中序遍历分别为ABDEGCFH与DBGEACHF,则该二叉树得后序遍历为______________________ 19、若某二叉树得前序遍历访问顺序就是abdgcefh,中序遍历访问顺序就是dgbaec hf,则其后序遍历得结点访问顺序就是_______________________ ?20、数据库保护分为:安全性控制、完整性控制、并发性控制与数据得恢复。 在计算机中,算法就是指_______________________ 算法一般都可以用哪几种控制结构组合而成_____________________ 、算法得时间复杂度就是指______________________ 5、算法得空间复杂度就是指__________________________ ?6、算法分析得目得就是__________________________ 11、数据得存储结构就是指_________________________ 12、数据得逻辑结构就是指(_______________________________ ?13、根据数据结构中各数据元素之间前后件关系得复杂程度,一般将数据结构分为__________________________________ 16、递归算法一般需要利用_______________________实现。 28、非空得循环单链表head得尾结点(由p所指向),满足(_____________________ 29、与单向链表相比,双向链表得优点之一就是____________________________--

典型数据结构面试题

数据结构 1?在一个单链表中p所指结点之前插入一个s (值为e)所指结点时,可执行如下操作: q=head; while (q->next!=p)q=q->next; s= newNode;s->data=e; q->next=;// 填空 s->next=;// 填空 2.线性表的顺序存储结构是一种的存储结构,而链式存储结构是一种___的 存储结构。 A.随机存取 B.索引存取 C.顺序存取 D.散列存取 3.线性表若采用链式存储结构时,要求内存中可用存储单元的地址___。 A.必须是连续的 B.部分地址必须是连续的 C.一定是不连续的 D.连续或不连续都可以 4?在一个单链表中,已知q所指结点是p所指结点的前驱结点,若在q和p 之间插入s结点,则执行_。 A.s->next=p->next;p->next=s; B.p->next=s->next;s->next=p;

C.q->next=s;s->next=p; D.p->next=s;s->next=q; 5.在一个单链表中,若p 所指结点不是最后结点,在p 之后插入s 所指结点,则执行__。 A.s->next=p;p->next=s; B.s->next=p->next;p->next=s; C.s->next=p->next;p=s; C. p->next=s;s->next=p; 6.在一个单链表中,若删除p 所指结点的后续结点,则执行__。 A.p->next= p->next->next; B.p= p->next;p->next= p->next->nex;t C.p->next= p->next; D.p= p->next->next; 7.链表不具备的特点是__。 A 可随机访问任何一个元素 B 插入、删除操作不需要移动元素 C无需事先估计存储空间大小D所需存储空间与线性表长度成正比 8.以下关于线性表的说法不正确的是。 A 线性表中的数据元素可以是数字、字符、记录等不同类型。 B 线性表中包含的数据元素个数不是任意的。 C 线性表中的每个结点都有且只有一个直接前趋和直接后继。 D 存在这样的线性表:表中各结点都没有直接前趋和直接后继。 9?在一个长度为n的顺序表中删除第i个元素,要移动个元素。如果要在第 i 个元素前插入一个元素,要后移()个元素。N-I N-I+1

22道数据结构算法面试题

微软的22道数据结构算法面试题(含答案)1、反转一个链表。循环算法。 1 List reverse(List l) { 2 if(!l) return l; 3 list cur = l.next; 4 list pre = l; 5 list tmp; 6 pre.next = null; 7 while ( cur ) { 8 tmp = cur; 9 cur = cur.next; 10 tmp.next = pre; 11 pre = tmp; 12 } 13 return tmp; 14 } 2、反转一个链表。递归算法。 1 List resverse(list l) { 2 if(!l || !l.next) return l; 3 4 List n = reverse(l.next); 5 l.next.next = l; 6 l.next=null; 7 } 8 return n; 9 } 3、广度优先遍历二叉树。 1 void BST(Tree t) { 2 Queue q = new Queue(); 3 q.enque(t); 4 Tree t = q.deque(); 5 while(t) { 6 System.out.println(t.value); 7 q.enque(t.left);

9 t = q.deque(); 10 } 11 } ---------------------- 1class Node { 2 Tree t; 3 Node next; 4 } 5class Queue { 6 Node head; 7 Node tail; 8 public void enque(Tree t){ 9 Node n = new Node(); 10 n.t = t; 11 if(!tail){ 12 tail = head = n; 13 } else { 14 tail.next = n; 15 tail = n; 16 } 17 } 18 public Tree deque() { 19 if (!head) { 20 return null; 21 } else { 22 Node n = head; 23 head = head.next; 24 return n.t; 25 } 26} 4、输出一个字符串所有排列。注意有重复字符。 1char[] p; 2void perm(char s[], int i, int n){ 3 int j; 4 char temp; 5 for(j=0;j

数据结构及算法招聘笔试及面试

数据结构及算法招聘笔试及面试 一、综述: 招聘考试中笔试偏基础知识考察,面试偏项目经验和算法的灵活应用的考察。考察的内容可以分为知识型题目和智力测试类的题目,平时可以充分准备知识型的题目,而智力测试类的题目在知名大公司的考察较多,可以多看一些典型的题目,争取能在应试中将其转换为记忆力的测试。 在软件类的应聘考试中要坚持“两个中心,三个基本点”。“两个中心”是以数据结构与算法为中心。对于计算机专业的人才来说,数据结构,算法应该是基石,也就是重中之重。这一点在牛企中更为突出,像百度,微软,google这样的企业,对这“两个中心”的要求更是高。“三个基本点”分别为程序设计语言,操作系统,数据库及网络。程序设计语言无论是java或者c++,你都要精通,也就是说要非常熟练。高水平的公司,对应聘者的综合素质跟专业知识要求都很高,专业知识方面数据结构算法尤为重要,所以大家如果有志于目前牛气的公司的话,一定要真的做到“精通” 数据结构与算法,其中排序算法最最重要。这里说的精通不但要能快速书写基本的典型的算法,而且要真正理解,灵活运用,做到举一反三,考察往往不是原原本本的考察知识点,而是进行略微的变化再考察,如果理解的不深刻,往往调到陷阱中。所以,大家要养成“反思”的习惯,即经常思考所学的知识。同时要多读书,多读经典的书籍,例如:《编程之美》,《C陷阱与缺陷》,《C和指针》,《计算机程序设计艺术(共四卷)》《数据结构C语言版》。 二:考察点 结合数据结构的知识点,主要考察的内容如下: 1、数据结构本质的理解:数据结构是解决复杂程序的建模问题的,如何将现实世界中的复杂多样的关系(1:1,1:n,n:m)在计算机的简单的一维内存结构中进行处理,如何利用现有的计算机资源高效的解决问题。逻辑结构、存储结构的关系。 2、算法的渐近时间复杂度和渐近空间复杂度的估计。 3、线性表的单链表和双向链表的操作 4、栈和队列应用,主要是递归算法如何转换为非递归算法。 5、串的模式匹配算法,数组的地址下标计算,和特殊矩阵的压缩存储,特别是稀疏矩阵的三元组存储结构和一次定位的快速转秩算法。 6、二叉树的5条性质,二叉树的四种遍历算法的递归和非递归实现,及其时间和空间复杂度。哈夫曼树的概念、存储结

数据结构-面试宝典

什么是哈希表?如何处理冲突? 哈希表又名散列表,是根据关键字直接寻找数据的存储位置,不需要进行比较,查找效率较高。 在构建哈希表中,最关键的就是哈希函数的设计,一般有六种方法: ● 直接定址法:哈希函数为一次函数; ● 数字分析法:如果关键字由多个字符或数字组成,可以考虑抽取其中的若干位作为哈希地址; ● 平方取中法:对关键字做平方操作,取中间的若干位作为哈希地址; ● 折叠法:将关键字分割为位数相同的几部分,取这几部分的叠加和(舍去进位)作为哈希地址; ● 除留余数法:若已知整个哈希表的最大长度m,则可以取一个不大于m的数p,对关键字进行取余运算,将运算结果作为哈希地址; ● 随机数法:取关键字的一个随机函数值作为哈希地址; 处理冲突的方法: ● 开放定址法:包含线性探测法、二次探测法、伪随机数探测法,即 H(key)=(H(key) + d) MOD m 其中d就是用上面三种方法确定的增量,分别为 ● 线性探测法:d = 1, 2, 3, ..., m-1,可以理解为一直向右寻找,子弹式; ● 二次探测法:d = 12, -12, 22, -22, 32,可以理解为一直向左/右寻找,涟漪式; ● 伪随机数探测法; ● 再哈希法:使用另一个哈希函数计算,直到冲突不再发生; ● 链地址法:将所有发生冲突的关键字所对应的数据全部存储在同一个线性链表中。 常见的树结构有哪些? ● 二叉树:对于一棵树,任意节点最多包含两个子树; ● 满二叉树:对于一棵二叉树,每一层的节点数目都是最大值; ● 深度为$k$的满二叉树必然包含$2^k-1$个节点; ● 包含$n$个节点的满二叉树的深度为$log_2(n+1)$;

2017年数据结构面试试题附答案

2017年数据结构面试试题附答案 1.栈和队列的共同特点是(只允许在端点处插入和删除元素) 4.栈通常采用的两种存储结构是(线性存储结构和链表存储结构) 5.下列关于栈的叙述正确的是(D) A.栈是非线性结构 B.栈是一种树状结构 C.栈具有先进先出的特征 D.栈有后进先出的特征 6.链表不具有的特点是(B)A.不必事先估计存储空间 B.可随机访问任一元素 C.插入删除不需要移动元素 D.所需空间与线性表长度成正比 7.用链表表示线性表的优点是(便于插入和删除操作) 8.在单链表中,增加头结点的目的是(方便运算的实现) 9.循环链表的主要优点是(从表中任一结点出发都能访问到整个链表) 10.线性表L=(a1,a2,a3,……ai,……an),下列说法正确的是(D) A.每个元素都有一个直接前件和直接后件 B.线性表中至少要有一个元素 C.表中诸元素的排列顺序必须是由小到大或由大到小 D.除第一个和最后一个元素外,其余每个元素都有一个且只有一个直接前件和直接后件 11.线性表若采用链式存储结构时,要求内存中可用存储单元的地址(D) A.必须是连续的 B.部分地址必须是连续的 C.一定是不连续的 D.连续不连续都可以 12.线性表的顺序存储结构和线性表的链式存储结构分别是(随机存取的存储结构、顺序存取的存储结构) 13.树是结点的集合,它的根结点数目是(有且只有1) 14.在深度为5的满二叉树中,叶子结点的个数为(31) 15.具有3个结点的二叉树有(5种形态) 16.设一棵二叉树中有3个叶子结点,有8个度为1的结点,则该二叉树中总的结点数为(13) 17.已知二叉树后序遍历序列是dabec,中序遍历序列是debac,它的前序遍历序列是(cedba) 18.已知一棵二叉树前序遍历和中序遍历分别为ABDEGCFH和DBGEACHF,则该二叉树的后序遍历为(DGEBHFCA) 19.若某二叉树的前序遍历访问顺序是abdgcefh,中序遍历访问顺序是dgbaechf,则其后序遍历的结点访问顺序是(gdbehfca) 20.数据库保护分为:安全性控制、完整性控制、并发性控制和数据的恢复。 1. 在计算机中,算法是指(解题方案的准确而完整的描述) 2.在下列选项中,哪个不是一个算法一般应该具有的基本特征(无穷性) 说明:算法的四个基本特征是:可行性、确定性、有穷性和拥有足够的情报。 3. 算法一般都可以用哪几种控制结构组合而成(顺序、选择、循环) 4.算法的时间复杂度是指(算法执行过程中所需要的基本运算次数) 5. 算法的空间复杂度是指(执行过程中所需要的存储空间) 6. 算法分析的目的是(分析算法的效率以求改进) 7. 下列叙述正确的是(C)

数据结构与算法面试题

目录 1. 数组 (3) 2. 链表 (5) 3. 栈 (9) 4. 队列 (10) 5. 堆(优先队列) (12) 6. 二叉树 (15) 7. 二叉查找树 (24) 8. 字典树 (26) 9. 平衡树(AVL) (26) 10. 红黑树 (26) 11. B树/B+树 (28) 12. 哈希 (29) 13. 图 (31) 14. 字符串 (33) 15. 排序 (36) 16. 二分查找 (40) 17. 跳跃列表 (41) 18. 动态规划 (42) 1.数组 应用场景: 1)数据比较少 2)经常做的运算是按序号访问数据元素 面试题 选择题: 1)对于长度为n的线性表,建立其对应的单链表的时间复杂度为()。 O(1) O(log2n) O(n) O(n^2) 2)下列哪些不是线性表? 队列 栈 关联数组 链表 3)稀疏矩阵一般的压缩存储方法有两种,即() 二维数组和三维数组 三元组和散列 三元组和十字链表 散列和十字链表 4)将10阶对称矩阵压缩存储到一维数组A中,则数组A的长度最少为

100 40 55 80 5) 设A是n*n的对称矩阵,将A的对角线及对角线上方的元素以列为主的次序存放在一维数组B[1..n(n+1)/2]中,对上述任一元素aij (1≤i,j≤n,且i≤j)在B中的位置为() i(i-1)/2+j j(j-1)/2+i j(j-1)/2+i-1 i(i-1)/2+j-1 6)若有定义: int c[4][5],( *pc)[5]; pc=c; 那么,下列对数组C的元素引用正确的是( )。 pc+1 * (pc+3) * (pc+1) +3 * (*pc+2) 问答题: 1)数组和链表的区别 思路: 从逻辑结构上来看,数组必须实现定于固定的长度,不能适应数据动态增减的情况,即数组的大小一旦定义就不能改变。当数据增加是,可能超过原先定义的元素的个数;当数据减少时,造成内存浪费;链表动态进行存储分配,可以适应数据动态地增减的情况,且可以方便地插入、删除数据项。 从内存存储的角度看;数组从栈中分配空间(用new则在堆上创建),对程序员方便快速,但是自由度小;链表从堆中分配空间,自由度大但是申请管理比较麻烦。 从访问方式类看,数组在内存中是连续的存储,因此可以利用下标索引进行访问;链表是链式存储结构,在访问元素时候只能够通过线性方式由前到后顺序的访问,所以访问效率比数组要低。 2)输入一个整型数组,数组里有正数也有负数。数组中一个或连续的多个整数组成一个子数组。求所有子数组的和的最大值。要求时间复杂度为O(n) 思路: Step1.从头到尾逐个累加数组中的每个数字,初始化和为0;(nCurrSum=0,nGreatestNum=int.MinValue) Step2.首先加上第一个数字,从第二个数字开始累加,依次将累加和保存到一个临时变量(nCurrSum)中; Step3.如果当前累加和(nCurrSum)小于0,那抛弃前面的子数组和,从下一个数字开始重新累加;相反,则将当前累加和(nCurrSum)与返回累加和(nGreatestNum)进行比较,如果nCurrSum>nGreatestNum,则更新nGreatestNum。

数据结构笔试面试题

数据结构笔试面试题 5, 找出单向链表的中间结点 这道题和解判断链表是否存在环,我用的是非常类似的方法,只不过结束循环的条件和函数返回值不一样罢了。设置两个指针p1,p2。每次循环p1向前走一步,p2向前走两步。当p2到达链表的末尾时,p1指向的时链表的中间。 link* mid(link* head) { link* p1,*p2; p1=p2=head; if(head==NULL || head->next==NULL) return head; do { p1=p1->next; p2=p2->next->next; } while(p2 && p2->next); return p1; }6,按单词反转字符串 并不是简单的字符串反转,而是按给定字符串里的单词将字符串倒转过来,就是说字符串里面的单词还是保持原来的顺序,这里的每个单词用空格分开。例如:Here is https://www.360docs.net/doc/605477718.html, 经过反转后变为: https://www.360docs.net/doc/605477718.html, is Here 如果只是简单的将所有字符串翻转的话,可以遍历字符串,将第一个字符和最后一个交换,第二个和倒数第二个交换,依次循环。其实按照单词反转的话可以在第一遍遍历的基础上,再遍历一遍字符串,对每一个单词再反转一次。这样每个单词又恢复了原来的顺序。 char* reverse_word(const char* str) { int len = strlen(str); char* restr = new char[len+1]; strcpy(restr,str); int i,j; for(i=0,j=len-1;i

面试经验分享之数据结构和算法题

数据结构题目 概述 分类讨论 类型一:数据结构实现 类型二:数据结构应用 准备建议 算法题目 概述 分类讨论 类型一:经典算法实现题 类型二:思维益智题 准备建议 开放题目 总结 前言 面试 IT 企业的研发岗位,数据结构和算法显然是必考的项目。俺只学过普通的数据结构课程,没读过 STL,也没有过 ACM 的训练和比赛经历,在一开始面对这样类型题目的时候,心里还是十分忐忑的。大大小小几十场面试下来,自己在这方面总算有了一定的心得积累,在此抛砖引玉,以飨读者。 面试经验分享之机器学习、大数据问题 互联网公司机器学习数据挖掘类的职位面试主要考察哪些? 如何快速备战面试中算法? 年底跳槽好福利,数据挖掘工程师面试指南 大数据技术Hadoop面试题,看看你能答对多少?答案在后面 在正式介绍题目和准备方法之前,有两点需要说明, Google 和 Facebook 这类对算法有很高要求的公司的在线测试我没有参加过(不过在牛人内推帮助下有过面试体验……),这超出了我目前的编码能力范围,网上有不少拿到 Google、Facebook offer 的经验总结文章,可以移步观赏;

前段时间在微博上又看到有人说自己把 leetcode 刷了好几遍,不过一些转发评论者觉得, IT 公司面试中的算法考察没有价值,一来工作里用不太上,二来把程序员素质考察搞成 了应试教育,他们认为更重要的是应聘者的工程能力。遇到这样的讨论,我一般喜欢和一 把稀泥。若干年前, Google、微软的面试题让大家眼前一亮,觉得能选拔出个性十足的 聪明人来,不过随着大家对这类题目的适应,可能选拔出来的人也在趋同,至少很多人都 会在面试前用心准备,据报道 Google 最近也是放弃了这类面试题目。没有什么一劳永逸、一成不变的考查方式,毕竟面试是人和人之间的动态“较量”。不要贪恋算法的奇技淫巧,也不要因为题目筛选力度的衰减而否定考察初衷。面试不仅是考验求职者,也同样在考验 面试官,如果问的都是老题儿,那本山大叔肯定都会抢答了。 言归正传,以下分数据结构题目、算法题目、开放题目三部分来介绍我在面试中碰到的问题。 数据结构题目 概述 虽然课本由简到繁、由难到易地介绍了诸多数据结构,我在面试中被问到的却还都是基本 类型,比如堆栈、队列、链表、二叉树。题目主要有两类,数据结构实现和具体情境下数 据结构的应用。 分类讨论 类型一:数据结构实现 实现 java.util.List 中的基础功能; 实现栈,使得 添加、删除、max 操作的复杂度为 O(1)(我脚着好像是不可实现的,想到 最好的是添加、删除 O(log), max 是 O(1)),实现见 正在努力减肥的胖子 同学给出 的评论,参考 leetcode 中的这道题目,惭愧; 选取任意数据结构实现添加、删除、随机返回三个功能,分析复杂度; 用数组实现队列,各操作的复杂度分析。

相关文档
最新文档