数据结构面试题精选

数据结构面试题精选
数据结构面试题精选

特别说明:

本文中二叉树结构定义为:

struct Node {

Node* left;

Node* right;

int data;

};

定义:空二叉树的高度为-1,只有根节点的二叉树高度为0,根节点在0层,深度为0。求二叉树中相距最远的两个节点之间的距离

两个节点的距离为两个节点间最短路径的长度。

求两节点的最远距离,实际就是求二叉树的直径。假设相距最远的两个节点分别为A、B,它们的最近共同父节点(允许一个节点是其自身的父节点)为C,则A到B的距离 = A到C的距离 + B

到C的距离。

节点A、B分别在C的左右子树下(假设节点C的左右两子树均包括节点C),不妨假设A在C的左子树上,由假设“A到B的距离最大”,先固定B点不动(即B到C的距离不变),根据上面的

公式,可得A到C的距离最大,即点A是C左子树下距离C最远的点,即:

A到C的距离 = C的左子树的高度。同理,B到C的距离 = C的右子树的高度。因此,本问题可以转化为:“二叉树每个节点的左右子树高度和的最大值”。

判断二叉树是否平衡二叉树

根据平衡二叉树的定义:每个结点的左右子树的高度差小等于1,只须在计算二叉树高度时,同时判断左右子树的高度差即可。

二叉树的广度遍历(某层)

若需要对同一层的节点数据进行一些特殊操作(比如:打印完一层后换行、只打印某一层),可以记录某一层的最后一个节点,当遍历完该节点时(此时,队列的中的最后一个元素恰好就是下一层的最后一个节点),再进行这些特殊操作。

指定二叉树,给定两节点求其最近共同父节点

遍历二叉树时,只有先访问给定两节点A、B后,才可能确定其最近共同父节点C,因而采用后序遍历。

可以统计任一节点的左右子树“是否包含A、B中的某一个”(也可以直接统计“包含了几个A、B”)。当后序遍历访问到某个节点D时,可得到三条信息:节点D是否是A、B两节点之一、其左子树是否包含A、B两节点之一、其右子树是否包含A、B两节点之一。当三条信息中有两个为真时,就可以确定节点D的父节点(或节点D,如果允许一个节点是自身的父节点的话)就是节点A、B的最近共同父节点。另外,找到最近共同父节点C后应停止遍历其它节点。

上面的代码中需要特别注意的是:判断所访问时节点是否是两节点A、B时要写成

const int mid=(root==va)+(root==vb);

而不是:const int mid =(root == va)|(root == vb);

这样当va等于vb时,可以得到正确结果。

二叉树的高度

求二叉树中叶子节点的个数

交换二叉树的左右儿子

从根节点开始找到所有路径,使得路径上的节点值和为某一数值(路径不一定以叶子节点结束)

这道题要找到所有的路径,显然是用深度优先搜索(DFS)啦。但是我们发现DFS所用的栈和输出路径所用的栈应该不是一个栈,栈中的数据是相反的。看看代码:注意使用的两个栈。

二叉树“弓”字形遍历

题目描述:对二叉树进行“弓”字形遍历,即第一层从左往右遍历,第二层从右往左遍历,第三层从左往右遍历.....

思路:传统的广度优先遍历,只需一个队列即可,但只能实现每层从左往右遍历。这里可以设两个栈,分别存放相邻两层的节点,先将某层节点存入一个栈,对这个栈的每个节点进行访问和出栈操作,在出栈的同时把它的孩子节点存入另一个栈,当这层的每个节点都操作完毕后,同时也实现了下一层节点在另一个栈的入栈操作。要注意的是,相邻两层的节点入栈的顺序是相反的,这样才能实现“弓”字形遍历。

在这边可以控制一个flag状态量,当栈中为空时,判断flag是否等于0,如果等于0则从左到右,否则就是从右到左

平衡二叉树(AVL树)

1)是一棵二叉查找树(BST),任意一棵子树,其左右子树的高度差不大于1

2)四种变形

LL型

RR型

LR

RL

判断二叉树是不是完全二叉树

红黑树

一般的,红黑树,满足以下性质,即只有满足以下全部性质的树,我们才称之为红黑树:

1)每个结点要么是红的,要么是黑的。

2)根结点是黑的。

3)每个叶结点,即空结点(NIL)是黑的。

4)如果一个结点是红的,那么它的俩个儿子都是黑的。

5)对每个结点,从该结点到其子孙结点的所有路径上包含相同数目的黑结点。

这些约束强制了红黑树的关键性质:最短的可能路径都是黑色节点,最长的可能路径有交替的红色和黑色节点。因为根据属性5所有最长的路径都有相同数目的黑色节点,这就表明了没有路径能多于任何其他路径的两倍长。

因为每一个红黑树也是一个特化的二叉查找树,因此红黑树上的只读操作与普通二叉查找树上的只读操作相同。然而,在红黑树上进行插入操作和删除操作会导致不再符合红黑树的性质。恢复红黑树的属性需要少量(O(log n))的颜色变更(实际是非常快速的)和不超过三次树旋转(对于插入操作是两次)。虽然插入和删除很复杂,但操作时间仍可以保持为O(log n) 次。

首先用与二叉搜索树一样的方法将一个结点插入到红黑树中,并且颜色为红色。(这个新结点的子结点将是叶结点,根据定义,这些叶结点是黑色的。)此时,我们将或者破坏了性质2(根结点为黑色)或者破坏了性质4(不能有两个相邻的红色结点)。

求链表倒数第k个结点

设置两个指针p1,p2,首先p1和p2都指向head,然后p2向前走k步,这样p1和p2之间就间隔k 个节点,最后p1和p2同时向前移动,直至p2走到链表末尾。

判断两个链表是否相交

题目描述:给出两个单向链表的头指针(如下图所示),

比如h1、h2,判断这两个链表是否相交。这里为了简化问题,我们假设两个链表均不带环。

分析:这是来自编程之美上的微软亚院的一道面试题目。请跟着我的思路步步深入(部分文字引自编程之美):

1. 直接循环判断第一个链表的每个节点是否在第二个链表中。但,这种方法的时间复杂度为

O(Length(h1) * Length(h2))。显然,我们得找到一种更为有效的方法,至少不能是O(N^2)的复杂度。

2. 针对第一个链表直接构造hash表,然后查询hash表,判断第二个链表的每个结点是否在

hash表出现,如果所有的第二个链表的结点都能在hash表中找到,即说明第二个链表与第一个链表有相同的结点。时间复杂度为为线性:O(Length(h1) + Length(h2)),同时为了存储第一个链表的所有节点,空间复杂度为O(Length(h1))。是否还有更好的方法呢,既能够以

线性时间复杂度解决问题,又能减少存储空间?

3. 进一步考虑“如果两个没有环的链表相交于某一节点,那么在这个节点之后的所有节点都是两

个链表共有的”这个特点,我们可以知道,如果它们相交,则最后一个节点一定是共有的。而我们很容易能得到链表的最后一个节点,所以这成了我们简化解法的一个主要突破口。那么,我们只要判断俩个链表的尾指针是否相等。相等,则链表相交;否则,链表不相交。

所以,先遍历第一个链表,记住最后一个节点。然后遍历第二个链表,到最后一个节点时和第一个链表的最后一个节点做比较,如果相同,则相交,否则,不相交。这样我们就得到了一个时间复杂度,它为O((Length(h1) + Length(h2)),而且只用了一个额外的指针来存储最后一个节点。这个方法时间复杂度为线性O(N),空间复杂度为O(1),显然比解法三更胜一筹。

4. 上面的问题都是针对链表无环的,那么如果现在,链表是有环的呢?还能找到最后一个结点

进行判断么?上面的方法还同样有效么?显然,这个问题的本质已经转化为判断链表是否有环。

那么,如何来判断链表是否有环呢?

总结:

所以,事实上,这个判断两个链表是否相交的问题就转化成了:

1.先判断带不带环

2.如果都不带环,就判断尾节点是否相等

3.如果都带环,判断一链表上俩指针相遇的那个节点,在不在另一条链表上。

如果在,则相交,如果不在,则不相交。

1、那么,如何编写代码来判断链表是否有环呢?因为很多的时候,你给出了问题的思路后,面试

官可能还要追加你的代码,ok,如下(设置两个指针(p1, p2),初始值都指向头,p1每次前进一步,p2每次前进二步,如果链表存在环,则p2先进入环,p1后进入环,两个指针在环中走动,必定相遇):

1.//copyright@ KurtWang

2.//July、2011.05.27。

3.struct Node

4.{

5.int value;

6. Node * next;

7.};

8.

9.//1.先判断带不带环

10.//判断是否有环,返回bool,如果有环,返回环里的节点

11.//思路:用两个指针,一个指针步长为1,一个指针步长为2,判断链表是否有环

12.bool isCircle(Node * head, Node *& circleNode, Node *& lastNode)

13.{

14. Node * fast = head->next;

15. Node * slow = head;

16.while(fast != slow && fast && slow)

17. {

18.if(fast->next != NULL)

19. fast = fast->next;

20.

21.if(fast->next == NULL)

22. lastNode = fast;

23.if(slow->next == NULL)

24. lastNode = slow;

25.

26. fast = fast->next;

27. slow = slow->next;

28.

29. }

30.if(fast == slow && fast && slow)

31. {

32. circleNode = fast;

33.return true;

34. }

35.else

36.return false;

37.}

2&3、如果都不带环,就判断尾节点是否相等,如果都带环,判断一链表上俩指针相遇的那个节点,在不在另一条链表上。下面是综合解决这个问题的代码:

1.//判断带环不带环时链表是否相交

2.//2.如果都不带环,就判断尾节点是否相等

3.//3.如果都带环,判断一链表上俩指针相遇的那个节点,在不在另一条链表上。

4.bool detect(Node * head1, Node * head2)

5.{

6. Node * circleNode1;

7. Node * circleNode2;

8. Node * lastNode1;

9. Node * lastNode2;

10.

11.bool isCircle1 = isCircle(head1,circleNode1, lastNode1);

12.bool isCircle2 = isCircle(head2,circleNode2, lastNode2);

13.

14.//一个有环,一个无环

15.if(isCircle1 != isCircle2)

16.return false;

17.//两个都无环,判断最后一个节点是否相等

18.else if(!isCircle1 && !isCircle2)

19. {

20.return lastNode1 == lastNode2;

21. }

22.//两个都有环,判断环里的节点是否能到达另一个链表环里的节点

23.else

24. {

25. Node * temp = circleNode1->next; //updated,多谢苍狼 and hyy。

26.while(temp != circleNode1)

27. {

28.if(temp == circleNode2)

29.return true;

30. temp = temp->next;

31. }

32.return false;

33. }

34.

35.return false;

36.}

扩展2:求两个链表相交的第一个节点

思路:在判断是否相交的过程中要分别遍历两个链表,同时记录下各自长度。

@Joshua:这个算法需要处理一种特殊情况,即:其中一个链表的头结点在另一个链表的环中,且不是环入口结点。这种情况有两种意思:1)如果其中一个链表是循环链表,则另一个链表必为循环链表,即两个链表重合但头结点不同;2)如果其中一个链表存在环(除去循环链表这种情况),则另一个链表必在此环中与此环重合,其头结点为环中的一个结点,但不是入口结点。在这种情况下我们约定,如果链表B的头结点在链表A的环中,且不是环入口结点,那么链表B的头结点即作为A和B 的第一个相交结点;如果A和B重合(定义方法时形参A在B之前),则取B的头结点作为A和B的第一个相交结点。

@风过无痕:读《程序员编程艺术》,补充代码2012年7月18日周三下午10:15

发件人: "風過無痕" 将发件人添加到联系人

收件人: "zhoulei0907"

你好

看到你在csdn上博客,学习了很多,看到下面一章,有个扩展问题没有代码,发现自己有个,发给你吧,思路和别人提出来的一样,感觉有代码更加完善一些,呵呵

扩展2:求两个链表相交的第一个节点

思路:如果两个尾结点是一样的,说明它们有重合;否则两个链表没有公共的结点。

在上面的思路中,顺序遍历两个链表到尾结点的时候,我们不能保证在两个链表上同时到达尾结点。这是因为两个链表不一定长度一样。但如果假设一个链表比另一个长L个结点,我们先在长的链表上遍历L个结点,之后再同步遍历,这个时候我们就能保证同时到达最后一个结点了。由于两个链表从第一个公共结点开始到链表的尾结点,这一部分是重合的。因此,它们肯定也是同时到达第一公共结点的。于是在遍历中,第一个相同的结点就是第一个公共的结点。

在这个思路中,我们先要分别遍历两个链表得到它们的长度,并求出两个长度之差。在长的链表上先遍历若干次之后,再同步遍历两个链表,直到找到相同的结点,或者一直到链表结束。PS:没有处理一种特殊情况:就是一个是循环链表,而另一个也是,只是头结点所在位置不一样。

代码如下:

1.ListNode* FindFirstCommonNode( ListNode *pHead1, ListNode *pHead2)

2.{

3.// Get the length of two lists

4. unsigned int nLength1 = ListLength(pHead1);

5. unsigned int nLength2 = ListLength(pHead2);

6.int nLengthDif = nLength1 - nLength2;

7.

8.// Get the longer list

9. ListNode *pListHeadLong = pHead1;

10. ListNode *pListHeadShort = pHead2;

11.if(nLength2 > nLength1)

12. {

13. pListHeadLong = pHead2;

14. pListHeadShort = pHead1;

15. nLengthDif = nLength2 - nLength1;

16. }

17.

18.// Move on the longer list

19.for(int i = 0; i < nLengthDif; ++ i)

20. pListHeadLong = pListHeadLong->m_pNext;

21.

22.// Move on both lists

23.while((pListHeadLong != NULL) && (pListHeadShort != NULL) && (pListHeadLong != pListHead

Short))

24. {

25. pListHeadLong = pListHeadLong->m_pNext;

26. pListHeadShort = pListHeadShort->m_pNext;

27. }

28.

29.// Get the first common node in two lists

30. ListNode *pFisrtCommonNode = NULL;

31.if(pListHeadLong == pListHeadShort)

32. pFisrtCommonNode = pListHeadLong;

33.

34.return pFisrtCommonNode;

35.}

36.

37.unsigned int ListLength(ListNode* pHead)

38.{

39. unsigned int nLength = 0;

40. ListNode* pNode = pHead;

41.while(pNode != NULL)

42. {

43. ++ nLength;

44. pNode = pNode->m_pNext;

45. }

46.return nLength;

47.}

数据结构常见笔试题

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/7714061701.html,/source/2813890 //此份答案是针对最初的V0.1版本,进行的校正与修正。 [答案V0.1版]精选微软数据结构+算法面试100题[前25题] https://www.360docs.net/doc/7714061701.html,/source/2796735 [第二部分]精选微软等公司结构+算法面试100题[前41-60题]: https://www.360docs.net/doc/7714061701.html,/source/2811703 [第一部分]精选微软等公司数据结构+算法经典面试100题[1-40题] https://www.360docs.net/doc/7714061701.html,/source/2778852 更多资源,下载地址: http://v_july_https://www.360docs.net/doc/7714061701.html,/ 很快,我将公布第21-40题的答案,敬请期待。:).. 如果你对以下的前第1-60题,有好的思路,和算法,欢迎跟帖回复, 或者,联系我,发至我的邮箱, zhoulei0907@https://www.360docs.net/doc/7714061701.html,。 My CSDN Blog:https://www.360docs.net/doc/7714061701.html,/v_JULY_v My sina Blog:https://www.360docs.net/doc/7714061701.html,/shitou009 帖子维护地址: [整理]算法面试:精选微软经典的算法面试100题[前1-60题] https://www.360docs.net/doc/7714061701.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/7714061701.html, 经过反转后变为: https://www.360docs.net/doc/7714061701.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 中的这道题目,惭愧; 选取任意数据结构实现添加、删除、随机返回三个功能,分析复杂度; 用数组实现队列,各操作的复杂度分析。

相关文档
最新文档