当前位置:文档之家› 25道常见算法面试题

25道常见算法面试题

25道常见算法面试题
25道常见算法面试题

Problem 1 : Is it a loop ? (判断链表是否有环?)

Assume that wehave a head pointer to a link-list. Also assumethat we know the list is single-linked. Can you come up an algorithm to checkwhether this link list includes a loop by using O(n) time and O(1) space wheren is the length of the list? Furthermore, can you do so with O(n) time and onlyone register?

方法:使用两个指针,从头开始,一个一次前进一个节点,一个前进2个节点,则最多2N,后两个指针可以重合;如果无环,则正常停止。

同样的,可以找到链表的中间节点。同上。

Problem 2:设计一个复杂度为n的算法找到链表倒数第m个元素。最后一个元素假定是倒数第0个。

提示:双指针查找

Problem 3:用最简单的方法判断一个LONG整形的数A是2^n(2的n次方)提示:x&(x-1)

Problem 4:两个烧杯,一个放糖一个放盐,用勺子舀一勺糖到盐,搅拌均匀,然后舀一勺混合物会放糖的烧杯,问你两个烧杯哪个杂质多?

提示:相同。假设杂质不等,那么将杂质放回原杯中,则杯中物体重量必变化,不合理。

Problem 5:给你a、b两个文件,各存放50亿条url,每条url各占用64字节,内存限制是4G,让你找出a、b文件共同的url。

法1:使用hash表。使用a中元素创建hash表,hash控制在适当规模。在hash中查找b的元素,找不到的url先存在新文件中,下次查找。如果找到,则将相应的hash表项删除,当hash表项少于某个阈值时,将a中新元素重新hash。再次循环。

法2:对于hash表项增加一项记录属于的文件a,b。只要不存在的表项即放入hash表中,一致的项则删除。注意:可能存在很多重复项,引起插入,删除频繁。

Problem 6:给你一个单词a,如果通过交换单词中字母的顺序可以得到另外的单词b,那么定义b是a的兄弟单词。现在给你一个字典,用户输入一个单词,让你根据字典找出这个单词有多少个兄弟单词。

提示:将每个的单词按照字母排序,则兄弟单词拥有一致的字母排序(作为单词签名)。使用单词签名来查找兄弟单词。

Problem 7:五桶球,一桶不正常,不知道球的重量和轻重关系,用天平称一次找出那桶不正常的球。

Problem 8:给两个烧杯,容积分别是m和n升(m!=n),还有用不完的水,用这两个烧杯能量出什么容积的水?

m, n, m+n, m-n以及线性叠加的组合

Problem 9:写出一个算法,对给定的n个数的序列,返回序列中的最大和最小的数。

Problem 10:你能设计出一个算法,只需要执行1.5n次比较就能找到序列中最大和最小的数吗?能否再少?

提示:先通过两两比较,区分大小放入“大”,“小”两个数组中。从而最大数在“大”数组中,最小数在“小”数组中。

Problem 11:给你一个由n-1个整数组成的未排序的序列,其元素都是1到n 中的不同的整数。请写出一个寻找序列中缺失整数的线性-时间算法。

提示:累加求和

Problem 12:void strton(const char* src, const char*token) 假设src是一长串字符,token存有若干分隔符,只要src的字符是token中的任何一个,就进行分割,最终将src按照token分割成若干单词。找出一种O(n)算法?

提示:查表的方法,将所有的字符串存储在长度为128的数组中,并将作为分隔符的字符位置1,这样即可用常数时间判断字符是否为分隔符,通过n次扫描,将src分割成单词。

Problem 13:一个排好序的数组A,长度为n,现在将数组A从位置m(m

提示:同样采用二分查找。核心思想就是确定所查找数所在的范围。通过比较3个数(头,尾,中间)和所查找数之间的关系,可以确定下次查找的范围。

Problem 14:一个排好序的数组A,长度为n,现在将数组A从位置m(m

提示:(A’B’)’ =BA

Problem 15:给出Vector的一个更好实现。(STL的vector内存的倍增的,但是每次倍增需要拷贝已存元素,平均每个元素需要拷贝一次,效率不高)

提示:可使用2^n的固定长度作为每次分配的最小单位,并有序的记录每个块的首地址。这中结构同样可以实现线性查找,并且拷贝代价很低(仅有指针)

Problem 16:给出已排序数组A,B,长度分别为n,m,请找出一个时间复杂度为(lgn)的算法,找到排在第k位置的数。

提示:二分查找。

Problem 17:给出任意数组A,B,长度分别为n,m,请找出一个时间复杂度为(lgn)的算法,找到排在第k位置的数。

提示:通过最小堆记录k个数,不断更新,扫描一次完毕。

这个提示有问题,求最优算法!

Problem 18:假设数组A有n个元素,元素取值范围是1~n,判定数组是否存在重复元素?要求复杂度为O(n)。

法1:使用n的数组,记录元素,存在记为1,两次出现1,即重复。

法2:使用m的数组,分别记录大小:n/m, 2n/m …..的元素个数。桶方法

法3:累加求和。可用于求仅有一个元素重复的方法。

Problem 19:给定排好序的数组A,大小为n,现给定数X,判断A中是否存在两数之和等于X。给出一个O(n)的算法。

提示:从中间向两边查找。利用有序的条件

Problem 20:给定排好序的数组A,大小为n,请给出一个O(n)的算法,删除重复元素,且不能使用额外空间。

提示,既然有重复,必有冗余空间。将元素放入数组的前面,并记录下次可放位置,不断向后扫描即可。

Problem 21:给定两个排好序的数组A,B,大小分别为n,m。给出一个高效算法查找A中的哪些元素存在B数组中。

注意:一般在大数组中执行二分查找,将小数组的元素作为需查找的对象。

更优算法(轩辕刃提供):可以使用两个指针遍历AB,比较当前大小就可以了...时间复杂度o(n+m)

Problem 22:问:有1000桶酒,其中1桶有毒。而一旦吃了,毒性会在1周后发作。现在我们用小老鼠做实验,要在1周内找出那桶毒酒,问最少需要多少老鼠。

答案:10只。将酒编号为1~1000 将老鼠分别编号为1 2 4 8 16 32 64 128 256 512 喂酒时让酒的编号等于老鼠编号的加和如:17号酒喂给1号和16号老鼠 76号酒喂给4号、8号和64号老鼠七天后将死掉的老鼠编号加起来得到的编号就是有毒的那桶酒因为2的10次方等于1024 所以10只老鼠最多可以测1024桶酒

证明如下:使用二进制表示:01, 10, 100, 1000, … , 1,000,000,000。对于任何一个小于1024的数,均可以采用前面的唯一一组二进制数来表示。故成立。

Problem 23:设计一组最少个数砝码,使得天平能够称量1~1000的重量。如果砝码只能放单边,1,2 ,4 , 512最好。(只能单加)

如果允许砝码双边放,1, 3, 9, 27….最好。(可加可减)已知1,3,如何计算下一个数。现可称重量1,2,3,4。设下个数为x,可称重量为, x-4, x-3, x-2, x-1, x, x+1, x+2, x+3, x+4。为使砝码最好,所称重量应该不重复(浪费)。故x=9。同理,可得后面。

图形算法题

Problem 24:如何判断一个点是否在一个多边形内?

提示:对多边形进行分割,成为一个个三角形,判断点是否在三角形内。

一个非常有用的解析几何结论:如果P2(x1,y1),P2(x2,y2), P3(x3,y3)是平面上的3个点,那么三角形P1P2P3的面积等于下面绝对值的二分之一:

| x1 y1 1 |

| x2 y2 1 | = x1y2 + x3y1 + x2y3 –x3y2 – x2y1 – x1y3

| x3 y3 1 |

当且仅当点P3位于直线P1P2(有向直线P1->P2)的右侧时,该表达式的符号为正。这个公式可以在固定的时间内,检查一个点位于两点确定直线的哪侧,以及点到直线的距离(面积=底*高/2)。

这个结论:可以用来判断点是否在点是否在三角形内。法1:判断点和三角形三边所行程的3个三角形的面积之和是否等于原来三角形的面积。(用了三次上面的公式)。

法2:判断是否都在三条边的同一边,相同则满足,否则不在三角形内。

Problem 25:给出两个n为向量与0点形成角的角平分线。

提示:对两条边进行归一化,得到长度为1的两点,取两个的中点即可。

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

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

计算机常见算法面试题

简介:计算机考研之家搜集的华为C语言经典面试题,来试试你的C语言水平吧。每道题都附有详细解答和讲解,很有参考价值的C语言面试题。 怎么判断链表中是否有环? bool CircleInList(Link* pHead) { if(pHead = = NULL || pHead->next = = NULL)//无节点或只有一个节点并且无自环 return (false); if(pHead->next = = pHead)//自环 return (true); Link *pTemp1 = pHead;//step 1 Link *pTemp = pHead->next;//step 2 while(pTemp != pTemp1 && pTemp != NULL && pTemp->next != NULL) { pTemp1 = pTemp1->next; pTemp = pTemp->next->next; } if(pTemp = = pTemp1) return (true); return (false); } 两个字符串,s,t;把t字符串插入到s字符串中,s字符串有足够的空间存放t字符串 void insert(char *s, char *t, int i) { memcpy(&s[strlen(t)+i],&s[i],strlen(s)-i); memcpy(&s[i],t,strlen(t)); s[strlen(s)+strlen(t)]='\0'; } 1。编写一个C 函数,该函数在一个字符串中找到可能的最长的子字符串,且该字符串是由同一字符组成的。 char * search(char *cpSource, char ch) { char *cpTemp=NULL, *cpDest=NULL; int iTemp, iCount=0; while(*cpSource) { if(*cpSource == ch) { iTemp = 0; cpTemp = cpSource; while(*cpSource == ch) ++iTemp, ++cpSource; if(iTemp > iCount)

百度笔试题及答案

第一题简答题 1.多线程和多进程模式有什么区别?在用两种模型开发服务程序时,分别有什么优缺点?采用长连接和短连接模式有什么区别?分别有什么优缺点?采用同步和异步模式有什么区别?分别有什么优缺点。 (1)启动进程的时候,操作系统会为进程分配资源,其中最主要的资源是内存空间,因为程序是在内存中运行的。在进程中,有些程序流程块是可以乱序执行的,并且这个代码块可以同时被多次执行。实际上,这样的代码块就是线程体。线程是进程中乱序执行的代码流程。当多个线程同时运行的时候,这样的执行模式成为并发执行。 对于一个进程中的多个线程来说,多个线程共享进程的内存块,当有新的线程产生的时候,操作系统不分配新的内存,而是让新线程共享原有的进程块的内存。因此,线程间的通信很容易,速度也很快。不同的进程因为处于不同的内存块,因此进程之间的通信相对困难。线程切换快,但实现稍复杂。进程易实现,较稳定,但性能与线程相比较差。 (2)所谓长连接,指在一个TCP连接上可以连续发送多个数据包,在TCP连接保持期间,如果没有数据包发送,需要双方发检测包以维持此连接,一般需要自己做在线维持。 短连接是指通信双方有数据交互时,就建立一个TCP连接,数据发送完成后,则断开此TCP连接,一般银行都使用短连接。 长连接多用于操作频繁,点对点的通讯,而且连接数不能太多情况,。每个TCP 连接都需要三步握手,这需要时间,如果每个操作都是先连接,再操作的话那么处理速度会降低很多,所以每个操作完后都不断开,次处理时直接发送数据包就OK了,不用建立TCP连接。而像WEB网站的http服务一般都用短链接,因为长连接对于服务端来说会耗费一定的资源,而像WEB网站这么频繁的成千上万甚至上亿客户端的连接用短连接会更省一些资源,如果用长连接,而且同时有成千上万的用户,如果每个用户都占用一个连接的话,那可想而知吧。所以并发量大,但每个用户无需频繁操作情况下需用短连好。 (3)同步:调用方调用一个程序,等待返回,然后再继续下面的程序处理 异步: 调用方调用一个程序,不等待返回,继续执行下面的程序。 1)异步通信简单,双方时钟可允许一定误差。同步通信较复杂,双方时钟的允许误差较小。 2)通信效率:异步通信低,同步通信高。

算法经典面试题

算法经典面试题 世界上第一位程序员是英国著名诗人拜伦的女儿AdaLovelace曾设计了巴贝奇分析机上解伯努利方程的一个程序。她甚至还建立了循环和子程序的概念。下面就由X为大家介绍一下程序员面试算法题的文章。 程序员面试算法题篇1 题目:输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表。要求不能创建任何新的结点,只调整指针的指向。 10 / \ 6 14 / \ / \ 4 8 12 16 转换成双向链表 4=6=8=10=12=14=16。 思路一:当我们到达某一个节点准备调整以该节点为根节点的子数时,先调整其左子树将左子树转换成一个排好序的左子链表,再调整其右子树转换成右子链表。最近链接左子链表的最右节点、当前节点和右子链表的最左节点。从树的根节点开始递归调整所有节点。

思路二:我们可以中序遍历整个树。按照这个方式遍历树,比较小的节点优先访问。如果我们每访问一个节点,假设之前访问过的节点已经调整为一个排序的双向链表,我们再把调整当前节点的指针链接到链表的末尾。当所有的节点都访问过之后,整棵树也就转换成一个排序的双向链表了。 参考代码: 二元查找树的节点数据结构: structBSTreeNode{ int value; BSTreeNode *m_left; BSTreeNode *m_right; } 思路二对应的代码: void ConvertNode(BSTreeNode* pNode, BSTreeNode*& pLastNodeInList) { if(pNode == NULL) return; BSTreeNode *pCurrent = pNode; // Convert the left sub-tree if (pCurrent->m_pLeft != NULL) ConvertNode(pCurrent->m_pLeft, pLastNodeInList);

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

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

25道常见算法面试题

Problem 1 : Is it a loop ? (判断链表是否有环?) Assume that wehave a head pointer to a link-list. Also assumethat we know the list is single-linked. Can you come up an algorithm to checkwhether this link list includes a loop by using O(n) time and O(1) space wheren is the length of the list? Furthermore, can you do so with O(n) time and onlyone register? 方法:使用两个指针,从头开始,一个一次前进一个节点,一个前进2个节点,则最多2N,后两个指针可以重合;如果无环,则正常停止。 同样的,可以找到链表的中间节点。同上。 Problem 2:设计一个复杂度为n的算法找到链表倒数第m个元素。最后一个元素假定是倒数第0个。 提示:双指针查找 Problem 3:用最简单的方法判断一个LONG整形的数A是2^n(2的n次方)提示:x&(x-1) Problem 4:两个烧杯,一个放糖一个放盐,用勺子舀一勺糖到盐,搅拌均匀,然后舀一勺混合物会放糖的烧杯,问你两个烧杯哪个杂质多? 提示:相同。假设杂质不等,那么将杂质放回原杯中,则杯中物体重量必变化,不合理。

Problem 5:给你a、b两个文件,各存放50亿条url,每条url各占用64字节,内存限制是4G,让你找出a、b文件共同的url。 法1:使用hash表。使用a中元素创建hash表,hash控制在适当规模。在hash中查找b的元素,找不到的url先存在新文件中,下次查找。如果找到,则将相应的hash表项删除,当hash表项少于某个阈值时,将a中新元素重新hash。再次循环。 法2:对于hash表项增加一项记录属于的文件a,b。只要不存在的表项即放入hash表中,一致的项则删除。注意:可能存在很多重复项,引起插入,删除频繁。 Problem 6:给你一个单词a,如果通过交换单词中字母的顺序可以得到另外的单词b,那么定义b是a的兄弟单词。现在给你一个字典,用户输入一个单词,让你根据字典找出这个单词有多少个兄弟单词。 提示:将每个的单词按照字母排序,则兄弟单词拥有一致的字母排序(作为单词签名)。使用单词签名来查找兄弟单词。 Problem 7:五桶球,一桶不正常,不知道球的重量和轻重关系,用天平称一次找出那桶不正常的球。

最受欢迎的前80个经典人工智能面试题目

最受欢迎的前80个经典人工智能面试 题目 在这里,我们整理了一份人工智能面试问题列表,以帮助您清除AI面试。我们提供了AI编程语言和应用程序,图灵测试,专家系统,各种搜索算法的详细信息,游戏理论,模糊逻辑,归纳,演绎和归纳机器学习,ML算法技术,朴 素 贝叶斯,Perceptron,KNN,LSTM,自动编码器等。 人工智能面试问题的最佳答案 1.强人工智能和弱人工智能有什么区别? 2.什么是人工智能? 人工智能是计算机科学领域,其中研究并尝试在机器/系统上复制人脑的认知功能。如今,人工智能已广泛用于各种应用程序,例如计算机视觉,语音识别,决策,感知,推理,认知能力等。

3.列出AI的一些应用。 ?自然语言处理 ?聊天机器人 ?情绪分析 ?销售预测 ?自动驾驶汽车 ?面部表情识别 ?图片标记 5.河内塔是什么? 河内之塔(Tower of Hanoi)是一个数学难题,它说明了如何将递归用作构建算法以解决特定问题的一种手段。使用AI中的决策树和广度优先搜索(BFS)算法,我们可以求解河内塔。 参加伦敦的人工智能课程,以清楚地了解人工智能! 6.什么是图灵测试? 图灵测试是一种测试机器匹配人类智能的能力的方法。机器被用来挑战人类的智能,当它通过测试时就被认为是智能的。然而,在没有充分了解如何模仿人类的情况下,机器可以被视为智能的。

7.什么是专家系统?专家系统的特征是什么? 专家系统是一个人工智能程序,具有关于特定区域以及如何利用其信息做出适当反应的专家级知识。这些系统具有替代人类专家的专业知识。它们的特征包括: ?高性能 ?足够的响应时间 ?可靠性 ?易懂 8.列出专家系统的优点。 ?一致性 ?记忆 ?勤勉 ?逻辑 ?多种专业知识 ?推理能力 ?反应快 ?自然无偏 9.什么是A *算法搜索方法? A *是一种计算机算法,广泛用于查找路径或遍历图形的目的,以便找到称为节点的各个点之间的最佳路线。

面试常见问题计算机网络

计算机网络OSI与TCP/IP各层的结构与功能,都有哪些协议。 ISO/OSI模型用途主要作用协议 应用层进程间通信为操作或网络应用程序提供访问 网络服务的接口。TFTP,HTTP,SNMP,FTP,SMTP,DNS,Telnet 表示层数据表示(编码)解决用户信息的语法表示问题。 提供格式化的表示和转换数据服 务。数据的压缩和解压缩,?和解 密等工作都由表示层负责。 无协议 会话层建立和管理主机 间的会话会话层不参与具体的传输,它提供 包括访问验证和会话管理在内的 建立和维护应用之间通信的机制。 如服务器验证用户登录便是由会 话层完成的。(以上统称报文) 无协议 传输层端到端链接提供主机之间连接,屏蔽技术细 节。将分组组成报文,可靠传输、 流量控制。为上层提供端到端(最 终用户到最终用户)的透明的、可 靠的数据传输服务。 TCP,UDP 网络层寻址路径选择为传输层提供建立、维护和网络连 接,解决路由选择。数据单元--- 分组packet IP,ICMP,RIP,OSPF,BGP,IGMP 数据链路层占用传输介质数据链路层在不可靠的物理介质 上提供可靠的传输。建立相邻结点 之间的数据链路,通过差错控制提 供数据帧(Frame)在信道上无差 错的传输。作用;物理地址寻址、 数据的成帧、流量控制、数据的检 错、重发。?SLIP,CSLIP,PPP,ARP,RARP,MTU

TCP/IP 相似之处: 基于独立的协议族,层的功能划分相似差异: ISO/OSI:从概念模型到协议实现;TCP/IP:从协议实现到概念描述

层次数量差别; 2.TCP与UDP的区别。 UDP(UserDatagramProtocol):不提供复杂的控制机制,利用IP提供面向无连接的通信服务。并且他是将应用程序发来的数据在收到那一刻,立刻按照原样发送到网络上的一种机制。即使出现网络拥堵,UDP也无法进行流量控制等避免拥塞的行为。如果传输途中出现丢包,也不负责重发。甚至出现包的到达乱序时也没有纠正功能。如果需要这些细节控制,要交给采用UDP的应用程序处理。UDP将控制转移到应用程序,只提供作为传输层协议的最基本功能。 TCP(TransmissionControlProtocol):TCP充分实现了数据传输时的各种控制功能,可以进行丢包的重发控制、对乱序的分包进行顺序控制。此外,TCP作为一种面向有链接的协议,只有在确认通信对端存在时才会发送数据,从而可以控制通信流量的浪费。 TCP通过检验和、序列号、确认应答、重发控制、连接管理以及窗口控制等机制实现可靠性传输。 如何加以区分使用? TCP用于传输层有必要实现可靠性传输的情况。UDP主要用于对高速传输和实时性有较高要求的通信或广播通信。 区别: 1)TCP面向连接;UDP是无连接的,发送数据之前不需要建立连接。 2)TCP提供可靠的服务。TCP传送的数据无差错,不丢失,不重复,且按序到达;UDP尽最大努力交付,不保证可靠交付。 3)TCP面向字节流,实际上TCP把数据看成一串无结构的字节流;UDP是面向报文的,UDP没有拥塞控制,网络出现拥塞不会使源主机的发送速率降低。 4)每一条TCP连接只能是点对点的;UDP支持一对一、一对多、多对一和多对多的交互通信 5)TCP首部开销20字节;UDP首部开销8字节; 6)TCP逻辑通信信道是全双工的可靠信道,UDP则是不可靠信道 3.TCP报文结构。 IP结构 首部固定长度20字节,所有IP数据报必须具有。 可选字段,长度可变。

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

一、单链表 目录 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种极特殊的情况:没有元素的单链表,以及只有一个元素的单链表,都是不需要反转的。

经典算法类笔试或面试题及答案

常见算法笔试或面试题 1、Is it a loop ? (判断链表是否有环?) Assume that we have a head pointer to a link-list. Also assume that we know the list is single-linked. Can you come up an algorithm to check whether this link list includes a loop by using O(n) time and O(1) space where n is the length of the list? Furthermore, can you do so with O(n) time and only one register? 方法:使用两个指针,从头开始,一个一次前进一个节点,一个前进2个节点,则最多2N,后两个指针可以重合;如果无环,则正常停止。同样的,可以找到链表的中间节点。同上。 2、设计一个复杂度为n的算法找到链表倒数第m个元素。最后一个元素假定是倒数第0个。 提示:双指针查找 3、用最简单的方法判断一个LONG整形的数A是2^n(2的n次方) 提示:x&(x-1) 4、两个烧杯,一个放糖一个放盐,用勺子舀一勺糖到盐,搅拌均匀,然后舀一勺混合物会放糖的烧杯,问你两个烧杯哪个杂质多? 提示:相同。假设杂质不等,那么将杂质放回原杯中,则杯中物体重量必变化,不合理。 5、给你a、b两个文件,各存放50亿条url,每条url各占用64字节,内存限制是4G,让你找出a、b文件共同的url。 方法一:使用hash表。使用a中元素创建hash表,hash控制在适当规模。在hash中查找b的元素,找不到的url先存在新文件中,下次查找。如果找到,则将相应的hash表项删除,当hash表项少于某个阈值时,将a中新元素重新hash。再次循环。 方法二:对于hash表项增加一项记录属于的文件a,b。只要不存在的表项即放入hash表中,一致的项则删除。注意:可能存在很多重复项,引起插入,删除频繁。 6、给你一个单词a,如果通过交换单词中字母的顺序可以得到另外的单词b,那么定义b是a的兄弟单词。现在给你一个字典,用户输入一个单

阿里校园招聘历年经典面试题汇总:算法工程师

阿里校园招聘历年经典面试题汇总:算法工程师 (1)、jvm 原理 (2)、minor GC 与 Full GC (3)、HashMap 实现原理 (4)、java.util.concurrent 包下使用过哪些 (5)、concurrentMap 和 HashMap 区别 (6)、信号量是什么,怎么使用? (7)、阻塞队列了解吗?怎么使用? (8)、JAVA NIO 是什么? (9)、类加载机制是怎样的 (10)、什么是幂等性 (11)、有哪些 JVM 调优经验 (12)、分布式 CAP 了解吗? (13)、hdfs怎么添加Datanode,添加后hdfs会有什么操作? (14)、Hbase 跟关系数据库对比优缺点?为什么 Hbase 索引速度快 (15)、Hbase 大压缩与小压缩区别 (16)、Hive 与 Hbase 的使用场景 (17)、简单说说Spark功能,spark 与hive有无依赖关系? (18)、zookeeper 有什么应用场景,怎么选举的?3 个节点挂掉一个能正常工作吗? (19)、Hbase 中 zookeaper 作用 (20)、Hbase 写操作什么时候返回 (21)、mysql 有哪些存储引擎?各自特点 (22)、用过哪些设计模式?怎样实现线程安全单例模式? (23)、用过哪些RPC框架? (24)、什么是AOP? (25)、决策树算法怎么实现的? (26)、java垃圾回收会出现不可回收的对象吗?怎么解决内存泄露问题?怎么

定位问题源? (27)、终止线程有几种方式?终止线程标记变量为什么是 valotile 类型?(28)、用过哪些并发的数据结构? cyclicBarrier 什么功能?信号量作用?数据库读写阻塞怎么解决? (29)、乐观锁与悲观锁,怎么实现乐观锁? (30)、开发过分布式框架?怎么实现分布式事务? (31)、spark streaming与storm区别? (32)、找到最大子数组的 start,和end下标 (33)、用过 CDH中什么任务调度? (34)、spark streaming时间间隔设置很小会出现什么状况? (35)、搜索引擎了解多少?你认为搜索引擎的难点在哪里? (36)、RPC 了解吗?怎么监控 RPC 状态,找出出现问题的 RPC 连接?(37)、spring 框架了解多少? (38)、flume应用场景 (39)、找出一串字符中第一个不重复字符的下标。 点击查看详细面经〉〉〉〉〉〉〉〉〉〉〉〉 更多精品干货>>>>>>>>>>> 更多阿里机器学习/数据挖掘经典面试题 其他名企机器学习/数据挖掘经典面试题

美团面试算法题

链表翻转。给出一个链表和一个数k,比如链表1→2→3→4→5→6,k=2,则翻转后2→1→4→3→6→5,若k=3,翻转后3→2→1→6→5→4,若k=4,翻转后4→3→2→1→5→6,用程序实现 1.struct Node{ 2.int data; 3.Node*next; 4.}; 5.void reverse(Node*head,Node*end){ 6.if(head==NULL||end==NULL)return; 7.Node*pre=NULL,*cur=head,*stop=end->next; 8.while(cur!=stop){ 9.Node*nxt=cur->next; 10.cur->next=pre; 11.pre=cur; 12.cur=nxt; 13.} 14.} 15. 16.Node*reverseAll(Node*head,int k){ 17.if(head==NULL||k<=0)return NULL; 18.Node*cur=head; 19.for(int i=0;inext; 21.if(cur==NULL) 22.break; 23.} 24.if(cur==NULL)return head; 25.Node*begin=cur->next,*end=begin; 26.Node*pre=head; 27.reverse(head,cur); 28. 29.while(begin!=NULL){ 30.for(int i=0;inext; 32.if(end==NULL) 33.break; 34.} 35.if(end==NULL){ 36.pre->next=begin; 37.break; 38.} 39.else{ 40.Node*nextbegin=end->next;

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

算法笔试题总结

一、递归和分制策略 汉诺塔递归实现: Void hannoi(int n,char x,char y,char z) { if (n ==1) move(x,1,z);//printf(“%i Move disk %i from %c to %c \n”,++c,n,x,z) //将编号1从x移到z else{ hanoi(n-1, x,z,y);//将x上编号1至n-1的移到y,z做辅助 move(x,n,z);// 将编号n从x移到z hanoi(n-1, y,x,z);// 将y上编号1至n-1的移到z,x做辅助 } } 递归小结 优点:结构清晰,可读性强,而且容易用数学归纳法来证明算法的正确性,因此它为设计算法、调试程序带来很大方便。 缺点:递归算法的运行效率较低,无论是耗费的计算时间还是占用的存储空间都比非递归算法要多。 解决方法:在递归算法中消除递归调用,使其转化为非递归算法。 1.采用一个用户定义的栈来模拟系统的递归调用工作栈。该方法通用性强,但本质上还是递归,只不过人工做了 本来由编译器做的事情,优化效果不明显。 2.用递推来实现递归函数。 3.通过Cooper变换、反演变换能将一些递归转化为尾递归,从而迭代求出结果。 后两种方法在时空复杂度上均有较大改善,但其适用范围有限。 排序总结 直接插入排序: void insertSort(listtp & r) { for(i=2; i<=n; i++) { r[0]=r[i]; /* 设置监视哨*/ j=i-1; k=r[i].key; while(j>0&&r[j].key>k)/* 大值的记录后移*/ { r[j+1]=r[j]; j--; } r[j+1]=r[0]; /*插入位置*/ } } /* straisort */ 希尔排序:将整个序列划分成若干子序列,分别进行直接插入排序。 void ShellSort(SeqList R,int dlta[],int t) { For(k=0;kk)/* 大值的记录后移*/ { r[j+dk]=r[j]; j-=dk; } r[j+dk]=r[0]; /*插入位置*/ } } /* straisort */ 冒泡排序: void buble_sort(listtp r) { for (i=1; i<=n-1; i++) /* 共计n-1趟 */ for (j=1; j<=n-i ; j++) if (r[j].key>r[j+1].key) { x=r[j]; r[j]=r[j+1] r[j+1]=x;} } /* bubble_sort */ 快速排序:在快速排序中,记录的比较和交换是从两端向中间进行的,关键字较大的记录一次就能交换到后面单元,关键字较小的记录一次就能交换到前面单元,记录每

各大公司算法笔试题

1、将一整数逆序后放入一数组中(要求递归实现) void convert(int *result, int n) { if(n>=10) convert(result+1, n/10); *result = n%10; } int main(int argc, char* argv[]) { int n = 123456789, result[20]={}; convert(result, n); printf("%d:", n); for(int i=0; i<9; i++) printf("%d", result[i]); } 2、求高于平均分的学生学号及成绩(学号和成绩人工输入) double find(int total, int n) { int number, score, average; scanf("%d", &number); if(number != 0) { scanf("%d", &score); average = find(total+score, n+1); if(score >= average) printf("%d:%d\n", number, score); return average; } else { printf("Average=%d\n", total/n); return total/n; } } int main(int argc, char* argv[]) { find(0, 0); } 3、递归实现回文判断(如:abcdedbca就是回文,判断一个面试者对递归理解的简单程序)int find(char *str, int n) { if(n<=1) return 1; else if(str[0]==str[n-1]) return find(str+1, n-2); else return 0; } int main(int argc, char* argv[]) { char *str = "abcdedcba"; printf("%s: %s\n", str, find(str, strlen(str)) ? "Yes" : "No");

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

1.栈和队列的共同特点是(只允许在端点处插入和删除元素) 4.栈通常采用的两种存储结构是(线性存储结构和链表存储结构) 5.下列关于栈的叙述正确的是(D) A.栈是非线性结构 B.栈是一种树状结构 C.栈具有先进先出的特征 D.栈有后进先出的特征 6.链表不具有的特点是(B) A.不必事先估计存储空间 B.可随机访问任一元素 C.插入删除不需要移动元素 D.所需空间与线性表xxxx 7.用链表表示线性表的优点是(便于插入和删除操作) 8.在单链表中,增加头结点的目的是(方便运算的实现) 9.循环链表的主要优点是(从表中任一结点出发都能访问到整个链表)1 0."线性表L=(a1,a2,a3,……ai,……an),下列说法正确的是(D) A.每个元素都有一个直接前件和直接后件 B.线性表中至少要有一个元素 C.表中诸元素的排列顺序必须是由小到大或由大到小

D.除第一个和最后一个元素外,其余每个元素都有一个且只有一个直接前件和直接后件 1 1."线性表若采用链式存储结构时,要求内存中可用存储单元的地址(D) A.必须是连续的 B.部分地址必须是连续的 C.一定是不连续的 D.连续不连续都可以 12."线性表的顺序存储结构和线性表的链式存储结构分别是(随机存取的存储结构、顺序存取的存储结构) 1 3."树是结点的集合,它的根结点数目是(有且只有1) 1 4."在深度为5的满二叉树中,叶子结点的个数为 (31) 1 5."具有3个结点的二叉树有(5种形态) 1 6."设一棵二叉树中有3个叶子结点,有8个度为1的结点,则该二叉树中总的结点数为 (13) 1

7."已知二叉树后序遍历序列是dabec,中序遍历序列是debac,它的前序遍历序列是(cedba) 1 8."已知一棵二叉树前序遍历和中序遍历分别为ABDEGCFH和DBGEACHF,则该二叉树的后序遍历为(DGEBHFCA) 1 9."若某二叉树的前序遍历访问顺序是abdgcefh,中序遍历访问顺序是dgbaechf,则其后序遍历的结点访问顺序是(gdbehfca) 2 0."数据库保护分为: 安全性控制、完整性控制、并发性控制和数据的恢复。 1.在计算机中,算法是指(解题方案的准确而完整的描述) 2.在下列选项中,哪个不是一个算法一般应该具有的基本特征(无穷性) 说明: 算法的四个基本特征是: 可行性、确定性、有穷性和拥有足够的情报。 3.算法一般都可以用哪几种控制结构组合而成(顺序、选择、循环) 4.算法的时间复杂度是指(算法执行过程中所需要的基本运算次数) 5.算法的空间复杂度是指(执行过程中所需要的存储空间) 6.算法分析的目的是(分析算法的效率以求改进) 7.下列叙述正确的是(C) A.算法的执行效率与数据的存储结构无关

微软四道经典算法面试题(附思路)

微软四道经典算法面试题(附思路) 1.比较经典的四个算法题,目前只收集到相关的思路和个别题目的解法,不断更新中 2. 1.一个整数数列,元素取值可能是0~65535中的任意一个数,相同数值不会重复出 现。0是例外,可以反复出现。 3.请设计一个算法,当你从该数列中随意选取5个数值,判断这5个数值是否连续相 邻。 4.注意: 5.- 5个数值允许是乱序的。比如: 8 7 5 0 6 6.- 0可以通配任意数值。比如:8 7 5 0 6 中的0可以通配成9或者4 7.- 0可以多次出现。 8.- 复杂度如果是O(n2)则不得分。 9. 2.设计一个算法,找出二叉树上任意两个结点的最近共同父结点。 10.复杂度如果是O(n2)则不得分。 11.3.一棵排序二叉树,令 f=(最大值最小值)/2,设计一个算法,找出距离f值最近、 大于f值的结点。 12.复杂度如果是O(n2)则不得分。 13.4.一个整数数列,元素取值可能是1~N(N是一个较大的正整数)中的任意一个数, 相同数值不会重复出现。设计一个算法,找出数列中符合条件的数对的个数,满足数对中两数的和等于N 1。 14.复杂度最好是O(n),如果是O(n2)则不得分。 15.思路分析 16.1.非0最大-非0最小 1 <=5 ==> 非0最大-非0最小 <=4 17.2.如果每个节点包含父亲指针,把两个节点到根的路径都记录下来,两条路径的最 后面的元素肯定相同, 18.从两条路径的最后一个元素向前比较,直到第一次出现分叉为止,就可以找到最近 节点。复杂度为O(n), 19.路径最长可能是n

20.如果不包含父亲节点,那就先前序遍历二叉树,遍历的时候可以像哈夫曼树那样左 右01编号, 21.记录给定两节点的到达路径,最后比较两个0,1序列的前面位数,直到出现不相等 为止,就找到最近父节点, 22.复杂度也是O(n) 23.3.找出最大值,最小值,复杂度都是O(h),然后搜索f,可以找到f应该插入的 位置,复杂度也是O(h), 24.再找f的后继,复杂度也是O(h),h最大可能是n,所以总体最坏情况复杂度就 是O(n) 25.4.先排序,复杂度O(nlgn),然后用两个指示器(front和back)分别指向第一 个和最后一个元素,如果 26.A[front] A[back]>N 1,则back–; 27.如果A[front] A[back]=N 1,则计数器加1,back–,同时front ; 28.如果A[front] A[back] 重复上述步骤,O(n)时间找到所有数对,总体复杂度 为O(nlgn) 29.题目分析 30.第1题:首先扫描一遍求出非0平均值,然后再扫描一遍即可判断,复杂度:O(n) 31.第2题,是一个送分题,可以设计一个相当巧妙的数据结构,其复杂度为O(n) 32.第3题,也是送分题,扫描几次即可 33.第4题,送分题。牺牲空间即可完成。 34.具体算法 35.1.思路是非0最大值-非0最小值 <=数组长度-1 36.我觉得这道题的前提非常重要 37.p ublic boolean isContiguous(int[] array) 38. { 39. int min=-1; 40. int max=-1; 41. for(int i=0;i

相关主题
文本预览
相关文档 最新文档