《专题资料(2021-2022年)IT公司面试手册DOC46页.docx》由会员分享,可在线阅读,更多相关《专题资料(2021-2022年)IT公司面试手册DOC46页.docx(46页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、第一部分1.栈和队列的共同特点是什么?答案:只允许在端点处插入和删除元素。2.栈通常采用的两种存储结构是什么?答案:线性存储结构和链表存储结构。3.下列关于栈的叙述正确的是(D)A.栈是非线性结构B.栈是一种树状结构C.栈具有先进先出的特征D.栈有后进先出的特征4.链表不具有的特点是(B)A.不必事先估计存储空间B.可随机访问任一元素C.插入删除不需要移动元素D.所需空间与线性表长度成正比5.用链表表示线性表的优点是什么?答案:便于插入和删除操作。6.在单链表中,增加头结点的目的是?答案:方便运算的实现。7.循环链表的主要优点是什么?答案:从表中任一结点出发都能访问到整个链表。8.线性表 L(
2、a1,a2,a3,ai,an),下列说法正确的是(D)A.每个元素都有一个直接前件和直接后件B.线性表中至少要有一个元素C.表中诸元素的排列顺序必须是由小到大或由大到小D.除第一个和最后一个元素外,其余每个元素都有一个且只有一个直接前件和直接后件9.线性表若采用链式存储结构时,要求内存中可用存储单元的地址(D)A.必须是连续的B.部分地址必须是连续的C.一定是不连续的D.连续不连续都可以10.线性表的顺序存储结构和线性表的链式存储结构分别是?答案:随机存取的存储结构和顺序存取的存储结构。11.树是结点的集合,它的根结点数目是多少?答案:有且只有 112.在深度为 5 的满二叉树中,叶子结点的个
3、数为?答案:3113.具有 3 个结点的二叉树有多少种形态?答案:5 种形态。14.设一棵二叉树中有 3 个叶子结点,有 8 个度为 1 的结点,则该二叉树中总的结点数为多少?答案:1315.已知二叉树后序遍历序列是 dabec,中序遍历序列是 debac,它的前序遍历序列是?答案:cedba16.已知一棵二叉树前序遍历和中序遍历分别为 ABDEGCFH 和DBGEACHF,则该二叉树的后序遍历为?答案:DGEBHFCA17.若某二叉树的前序遍历访问顺序是 abdgcefh,中序遍历访问顺序是 dgbaechf,则其后序遍历的结点访问顺序是?答案:gdbehfca第二部分1.在计算机中,算法是
4、指什么?答案:解题方案的准确而完整的描述。2.在下列选项中,哪个不是一个算法一般应该具有的基本特征?说明:算法的四个基本特征是:可行性、确定性、有穷性和拥有足够的情报。答案:无穷性。3.算法一般都可以用哪几种控制结构组合而成?答案:顺序、选择、循环。4.算法的时间复杂度是指?答案:算法执行过程中所需要的基本运算次数。5.算法的空间复杂度是指?答案:执行过程中所需要的存储空间。6.算法分析的目的是?答案:分析算法的效率以求改进。7.下列叙述正确的是(C)A算法的执行效率与数据的存储结构无关B算法的空间复杂度是指算法程序中指令(或语句)的条数C算法的有穷性是指算法必须能在执行有限个步骤之后终止D算
5、法的时间复杂度是指执行算法程序所需要的时间8.数据结构作为计算机的一门学科,主要研究什么?答案:主要研究数据的逻辑结构、对各种数据结构进行的运算,以及数据的存储结构。9.数据结构中与所使用的计算机无关的是数据的(C)A存储结构 B物理结构C逻辑结构 D物理和存储结构10.下列叙述中,错误的是(B)A数据的存储结构与数据处理的效率密切相关B数据的存储结构与数据处理的效率无关C数据的存储结构在计算机中所占的空间不一定是连续的D一种数据的逻辑结构可以有多种存储结构11.数据的存储结构是指什么?答案:数据的逻辑结构在计算机中的表示。12.数据的逻辑结构是指?答案:反映数据元素之间逻辑关系的数据结构。1
6、3.根据数据结构中各数据元素之间前后件关系的复杂程度,一般将数据结构分为?答案:线性结构和非线性结构。14.下列数据结构具有记忆功能的是(C)A队列B循环队列C栈D顺序表15.下列数据结构中,按先进后出原则组织数据的是(B)A线性链表B栈C循环链表D顺序表16.递归算法一般需要利用什么实现?答案:队列17.下列关于栈的叙述中正确的是(D)A在栈中只能插入数据B在栈中只能删除数据C栈是先进先出的线性表D栈是先进后出的线性表18.由两个栈共享一个存储空间的好处是?答案:节省存储空间,降低上溢发生的机率。19.下列关于队列的叙述中正确的是(C)A在队列中只能插入数据B在队列中只能删除数据C队列是先进
7、先出的线性表D队列是先进后出的线性表20.下列叙述中,正确的是(D)A线性链表中的各元素在存储空间中的位置必须是连续的B线性链表中的表头元素一定存储在其他元素的前面C线性链表中的各元素在存储空间中的位置不一定是连续的,但表头元素一定存储在其他元素的前面D线性链表中的各元素在存储空间中的位置不一定是连续的,且各元素的存储顺序也是任意的21.下列叙述中正确的是(A)A线性表是线性结构B栈与队列是非线性结构C线性链表是非线性结构D二叉树是线性结构22.线性表 L(a1,a2,a3,ai,an),下列说法正确的是(D)A每个元素都有一个直接前件和直接后件B线性表中至少要有一个元素C表中诸元素的排列顺序
8、必须是由小到大或由大到小D除第一个元素和最后一个元素外,其余每个元素都有一个且只有一个直接前件和直接后件23.线性表若采用链式存储结构时,要求内存中可用存储单元的地址怎么样?答案:连续不连续都可以。24.链表不具有的特点是(B)A不必事先估计存储空间B可随机访问任一元素C插入删除不需要移动元素D所需空间与线性表长度成正比25.在(D)中,只要指出表中任何一个结点的位置,就可以从它出发依次访问到表中其他所有结点。A线性单链表B双向链表C线性链表D循环链表26.以下数据结构属于非线性数据结构的是(C)A队列B线性表C二叉树D栈27.树是结点的集合,它的根结点数目是多少?答案:有且只有 1。28.在
9、一棵二叉树上第 8 层的结点数最多是?答案:12829.在深度为 5 的满二叉树中,叶子结点的个数为?答案:1630.在深度为 5 的满二叉树中,共有多少个结点?答案:3131.设一棵完全二叉树共有 699 个结点,则在该二叉树中的叶子结点数为?答案:350说明:完全二叉树总结点数为 N,若 N 为奇数,则叶子结点数为(N+1)/2;若 N 为偶数,则叶子结点数为 N/2。32.设有下列二叉树,对此二叉树中序遍历的结果是(B)AABCDEFBDBEAFCCABDECFDDEBFCA33.若某二叉树的前序遍历访问顺序是 abdgcefh,中序遍历访问顺序是 dgbaechf,则其后序遍历的结点访
10、问顺序是?答案:gdbehfca34.串的长度是?答案:串中所含字符的个数。35.设有两个串 p 和 q,求 q 在 p 中首次出现位置的运算称做?答案:模式匹配。36.N 个顶点的连通图中边的条数至少为?答案:N-137.N 个顶点的强连通图的边数至少有?答案:N38.对长度为 n 的线性表进行顺序查找,在最坏情况下所需要的比较次数为?答案:N39.最简单的交换排序方法是?答案:冒泡排序40.假设线性表的长度为 n,则在最坏情况下,冒泡排序需要的比较次数为?答案:n(n-1)/241.在待排序的元素序列基本有序的前提下,效率最高的排序方法是?答案:冒泡排序42.在最坏情况下,下列顺序方法中时
11、间复杂度最小的是?答案:堆排序43.希尔排序法属于?答案:插入类排序44.堆排序法属于?答案:选择类排序45.在下列几种排序方法中,要求内存量最大的是?答案:归并排序46.已知数据表 A 中每个元素距其最终位置不远,为节省时间,应采用?答案:直接插入排序第三部分1.一个算法通常由哪两种基本要素组成?答案:一是对数据对象的运算和操作,二是算法的控制结构。2.算法的复杂度主要包括什么?答案:时间复杂度和空间复杂度。实现算法所需的存储单元多少和算法的工作量大小分别称为算法的空间复杂度和时间复杂度。3.什么是数据处理?答案:所谓数据处理是指对数据集合中的各元素以各种方式进行运算,包括插入、删除、查找、
12、更改等运算,也包括对数据元素进行分析。4.数据结构是指?答案:数据结构是指相互有关联的数据元素的集合。5.数据结构分为?答案:数据结构分为逻辑结构与存储结构,线性链表属于存储结构。6.数据结构包括?答案:数据结构包括数据的逻辑结构和数据的存储结构。7.数据元素之间的任何关系都可以用什么来描述?答案:用前趋和后继关系来描述。8.数据的逻辑结构分为哪两大类?答案:有线性结构和非线性结构两大类。9.常用的存储结构有?答案:顺序、链接、索引等存储结构。10.顺序存储方法是什么?答案:顺序存储是把逻辑上相邻的结点存储在物理位置相邻的存储单元中。11.栈的基本运算有哪三种?答案:入栈、退栈与读栈顶元素。1
13、2.队列主要有哪两种基本运算?答案:入队运算与退队运算。13.栈和队列通常采用的存储结构是?答案:链式存储和顺序存储。14.当线性表采用顺序存储结构实现存储时,其主要特点是?答案:逻辑结构中相邻的结点在存储结构中仍相邻。15.循环队列主要有两种基本运算?答案:入队运算与退队运算。每进行一次入队运算,队尾指针就进 1。16.当循环队列非空且队尾指针等于对头指针时,说明循环队列已满,不能进行入队运算。这种情况称为?答案:上溢。17.当循环队列为空时,不能进行退队运算,这种情况称为?答案:下溢。第四部分1.判断链表是否存在环型链表问题判断一个链表是否存在环,例如下面这个链表就存在一个环:例如:N1-
14、N2-N3-N4-N5-N2 就是一个有环的链表,环的开始结点是 N5 这里有一个比较简单的解法。设置两个指针 p1,p2。每次循环 p1 向前走一步,p2 向前走两步。直到 p2 碰到 NULL 指针或者两个指针相等结束循环。如果两个指针相等则说明存在环。struct linkint data;link*next;bool IsLoop(link*head)link*p1=head,*p2=head;if(head=NULL|head-next=NULL)return false;dop1=p1-next;p2=p2-next-next;while(p2&p2-next&p1!=p2);if
15、(p1=p2)return true;elsereturn 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;pr
16、e=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
17、;return p;elselinka*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=s
18、ize2-1,mid;while(startbj)j+;if(ai i+;return false;4.最大子序列问题给定一整数序列 A1,A2,.An(可能有负数),求 A1An 的一个子序列 AiAj,使得 Ai 到 Aj 的和最大。例如:整数序列-2,11,-4,13,-5,2,-5,-3,12,-9 的最大子序列的和为21。对于这个问题,最简单也是最容易想到的那就是穷举所有子序列的方法。利用三重循环,依次求出所有子序列的和然后取最大的那个。当然算法复杂度会达到 O(n3)。显然这种方法不是最优的,下面给出一个算法复杂度为 O(n)的线性算法实现,算法的来源于 ProgrammingPe
19、arls 一书。在给出线性算法之前,先来看一个对穷举算法进行优化的算法,它的算法复杂度为 O(n2)。其实这个算法只是对对穷举算法稍微做了一些修改:其实子序列的和我们并不需要每次都重新计算一遍。假设 Sum(i,j)是 Ai.Aj的和,那么 Sum(i,j+1)=Sum(i,j)+Aj+1。利用这一个递推,我们就可以得到下面这个算法:int max_sub(int a,int size)int i,j,v,max=a0;for(i=0;i v=0;for(j=i;j v=v+aj;/Sum(i,j+1)=Sum(i,j)+Aj+1if(vmax)max=v;return max;那怎样才能达到
20、线性复杂度呢?这里运用动态规划的思想。先看一下源代码实现:int max_sub2(int a,int size)int i,max=0,temp_sum=0;for(i=0;i temp_sum+=ai;if(temp_summax)max=temp_sum;else if(temp_sum1,2,5,4,1,0void static remove_duplicated(int a,vector&_st)_st.push_back(a0);for(int i=1;_st_st.size()-1!=0;i+)if(ai-1!=ai)_st.push_back(ai);当然如果可以改变原来的数组
21、的话,可以不用 STL,仅需要指针操作就可以了。下面这个程序将修改原来数组的内容。void static remove_duplicated2(int a)if(a0=0|a=NULL)return;int insert=1,current=1;while(acurrent!=0)if(acurrent!=acurrent-1)ainsert=acurrent;insert+;current+;elsecurrent+;ainsert=0;7.如何判断一棵二叉树是否是平衡二叉树问题判断一个二叉排序树是否是平衡二叉树 解决方案:根据平衡二叉树的定义,如果任意节点的左右子树的深度相差不超过 1,那
22、这棵树就是平衡二叉树。首先编写一个计算二叉树深度的函数,利用递归实现。templatestatic int Depth(BSTreeNode*pbs)if(pbs=NULL)return 0;elseint ld=Depth(pbs-left);int rd=Depth(pbs-right);return 1+(ld rd?ld:rd);下面是利用递归判断左右子树的深度是否相差 1 来判断是否是平衡二叉树的函数:templatestatic bool isBalance(BSTreeNode*pbs)if(pbs=NULL)return true;int dis=Depth(pbs-left)
23、Depth(pbs-right);if(dis1|disleft)&isBalance(pbs-right);第五部分微软的 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=pre11 pre=tmp;12 13 return tmp;14 2、反转一个链表。递归算法。1 List resv
24、erse(list l)2 if(!l|!l.next)return l;34 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);8 q.enque(t.right);9 t=q.deque();10 11-1class Node
25、 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 264、输出一个字符
26、串所有排列。注意有重复字符。1char p;2void perm(char s,int i,int n)3 int j;4 char temp;5 for(j=0;j 6 if(j!=0&sj=sj-1);7 elseif(sj!=)8 pi=sj;9 sj=;10 if(i=n-1)11 pn=0;12 printf(%s,p);13 else14 perm(s,i+1,n);15 16 sj=pi;17 18 19-1void main()2 char sN;3 sort(s);4 perm(s,0,strlen(s);55、输入一个字符串,输出长型整数。1 long atol(char*
27、str)2 char*p=str;3 long l=1;m=0;4 if(*p=-)5 l=-1;6+p;7 8 while(isDigit(*p)9 m=m*10+p;10+p;11 12 if(!p)return m*l;13 else return error;146、判断一个链表是否有循环。1 int isLoop(List l)2 if(!l)return-1;3 List s=l.next;4 while(s&s!=l)5 s=s.next;6 7 if(!s)return-1;8 else reutrn 1;9-1int isLoop(List l)2 if(!l)return
28、0;3 p=l.next;4 wihle(p!=l&p!=null)5 l.next=l;6 l=p;p=p.next;7 8 if(p=l)return 1;9 return 0;10实际上,在我的面试过程中,还问到了不破坏结构的其他算法。我的答案是从链表头开始遍历,如果节点 next 指针指向自身,则循环存在;否则将 next 指针指向自身,遍历下一个节点。直至 next 指针为空,此时链表无循环。7、反转一个字符串。1 void reverse(char*str)2 char tmp;3 int len;4 len=strlen(str);5 for(int i=0;i len/2;+i
29、)6 tmp=char i;7 stri=strlen-i-1;8 strlen-i-1 =tmp;9 10 8、实现 strstr 函数。1int strstr(char str,char par)2 int i=0;3 int j=0;4 while(stri&strj)5 if(stri=parj)6+i;7+j;8 else9 i=i-j+1;10 j=0;11 12 13 if(!strj)return i-strlen(par);14 else return-1;159、实现 strcmp 函数。1int strcmp(char*str1,char*str2)2 while(*st
30、r1&*str2&*str1=*str2)3+str1;4+str2;5 6 return*str1-*str2;710、求一个整形中 1 的位数。1 int f(int x)2 int n=0;3 while(x)4+n;5 x&=x-1;6 7 return n;8 11、汉诺塔问题。1void tower(n,x,y,z)2 if(n=1)move(x,z);3 else 4 tower(n-1,x,z,y);5 move(x,z);6 tower(n-1,y,x,z);7 812、三柱汉诺塔最小步数。1 int f3(n)2 if(f3n)return f3n;3 else 4 if(
31、n=1)5 f3n=1;6 return 1;7 8 f3n=2*f3(n-1)+1;9 return f3n;10 11 四柱汉诺塔最小步数。1int f4(n)2 if(f4n=0)3 if(n=1)4 f41=1;5 return 1;6 7 min=2*f4(1)+f3(n-1);8 for(int i=2;i 9 u=2*f4(i)+f3(n-i);10 if(u 11 12 f4n=min;13 return min;14 else return f4n;1513、在一个链表中删除另一个链表中的元素。1void delete(List m,List n)2 if(!m|!n)ret
32、urn;3 List pre=new List();4 pre.next=m;5 List a=m,b=n,head=pre;6 while(a&b)7 if(a.value b.value)11 b=b.next;12 else13 a=a.next;14 pre.next=a;15 16 17 m=head.next;1814、一个数组,下标从 0 到 n,元素为从 0 到 n 的整数。判断其中是否有重复元素。1int hasDuplicate(int a,int n)2 for(int i=0;i 3 while(ai!=i&ai!=-1)4 if(aai=-1)return 1;5 a
33、i=aai;6 aai=-1;7 8 if(ai=i)ai=-1;9 10 return 0;1115、判断一颗二叉树是否平衡。1int isB(Tree t)2 if(!t)return 0;3 int left=isB(t.left);4 int right=isB(t.right);5 if(left=0&right=0&left right=-1)6 return(left 7 else return-1;8916、返回一颗二叉树的深度。1int depth(Tree t)2 if(!t)return 0;3 else 4 int a=depth(t.right);5 int b=de
34、pth(t.left);6 return(ab)?(a+1):(b+1);7 817、两个链表,一升一降。合并为一个升序链表。1 List merge(List a,List d)2 List a1=reverse(d);3 List p=q=new List();4 while(a&a1)5 if(a.value a1.value)6 p.next=a;7 a=a.next;8 else 9 p.next=a1;10 a1=a1.next;11 12 p=p.next;13 14 if(a)p.next=a;15 elseif(a1)p.next=a1;16 return q.next;17
35、 18、将长型转换为字符串。1char*ltoa(long l)2 charN str;3 int i=1,n=1;4 while(!(l/i10)i*=10;+n5 char*str=(char*)malloc(n*sizeof(char);6 int j=0;7 while(l)8 strj+=l/i;9 l=l%i;10 i/=10;11 12 return str;1319、用一个数据结构实现1 if(x=0)y=a;2 else y=b;1 j=a,b;2 y=jx;20、在双向链表中删除指定元素。1void del(List head,List node)2 List pre=ne
36、w List();3 pre.next=head;4 List cur=head;5 while(cur&cur!=node)6 cur=cur.next;7 pre=pre.next;8 9 if(!cur)return;10 List post=cur.next;11 pre.next=cur.next;12 post.last=cur.last;13 return;1421、不重复地输出升序数组中的元素。1 void outputUnique(char str,int n)2 if(n=0)return;3 elseif(n=1)putchar(str 0);4 else 5 int i
37、=0,j=1;6 putchar(str 0);7 while(j n)8 if(strj!=stri)9 putchar(strj);10 i=j;11 12+j;13 14 15 22、面试过程中我还遇到了下面几题:1、如何删除链表的倒数第 m 的元素?我的方法是先用 pre 指针从链表头开始步进 m,新建 pst 节点 next 指针指向头节点,cur 指针指向头节点,然后 pre,cur,post 三个指针一起步进,当 pre 指向链表结尾的时候 cur 指向倒数第 m 个元素,最后利用 pst 指针删除 cur 指向元素。2、如何判断一个字符串是对称的?如 a,aa,aba。设置头尾指针同时向中间比较靠齐直至相遇。3、如何利用 2 函数找出一个字符串中的所有对称子串?以子串头指针和尾指针为循环变量设置两个嵌套的循环以找出所有子串,对每个子串应用 2 函数。