面试微软必备22道数据结构算法面试题(含答案)
微软公司面试题及答案
微软面试题及答案2009-09-28 10:56 P.M.1.烧一根不均匀的绳,从头烧到尾总共需要1个小时。
现在有若干条材质相同的绳子,问如何用烧绳的方法来计时一个小时十五分钟呢?2.你有一桶果冻,其中有黄色、绿色、红色三种,闭上眼睛抓取同种颜色的两个。
抓取多少个就可以确定你肯定有两个同一颜色的果冻?3.如果你有无穷多的水,一个3公升的提捅,一个5公升的提捅,两只提捅形状上下都不均匀,问你如何才能准确称出4公升的水?4.一个岔路口分别通向诚实国和说谎国。
来了两个人,已知一个是诚实国的,另一个是说谎国的。
诚实国永远说实话,说谎国永远说谎话。
现在你要去说谎国,但不知道应该走哪条路,需要问这两个人。
请问应该怎么问?5.12个球一个天平,现知道只有一个和其它的重量不同,问怎样称才能用三次就找到那个球。
13个呢?(注意此题并未说明那个球的重量是轻是重,所以需要仔细考虑)6.在9个点上画10条直线,要求每条直线上至少有三个点?7.在一天的24小时之中,时钟的时针、分针和秒针完全重合在一起的时候有几次?都分别是什么时间?你怎样算出来的?答案:1.一要一头烧,一根从两头烧,再有一根做参照,两头烧完的记下位置(即烧到这里要半小时),把参照的那根从标记位置处剪开,取其中一段A。
一头烧的那根烧完后(就是一个小时后),把A从两头开始烧,烧完后即为十五分钟,加起来共一小时十五分钟。
2.答案:四个~3.大桶装满水,倒入小桶,大桶剩下2公升水。
小桶水倒掉,大桶剩2公升水倒入小桶中,大桶再装满后,倒入小桶至小桶满,大桶即剩4公升水。
4.如果参加过类似于奥林匹克数学班的,都应做过这些题。
问他你的国家怎么走,他肯定指向的是诚实国。
5.12个时可以找出那个是重还是轻,13个时只能找出是哪个球,轻重不知。
把球编为①②③④⑤⑥⑦⑧⑨⑩⑾⑿。
(13个时编号为⒀)第一次称:先把①②③④与⑤⑥⑦⑧放天平两边,㈠如相等,说明特别球在剩下4个球中。
微软等数据结构+算法面试100题全部答案集锦(1) -
微软等数据结构+算法面试100题全部答案集锦作者:July、阿财。
时间:二零一一年十月十三日。
引言无私分享造就开源的辉煌。
今是二零一一年十月十三日,明日14日即是本人刚好开博一周年。
在一周年之际,特此分享出微软面试全部100题答案的完整版,以作为对本博客所有读者的回馈。
一年之前的10月14日,一个名叫July (头像为手冢国光)的人在一个叫csdn的论坛上开帖分享微软等公司数据结构+算法面试100题,自此,与上千网友一起做,一起思考,一起解答这些面试题目,最终成就了一个名为:结构之法算法之道的编程面试与算法研究并重的博客,如今,此博客影响力逐步渗透到海外,及至到整个互联网。
在此之前,由于本人笨拙,这微软面试100题的答案只整理到了前60题(第1-60题答案可到本人资源下载处下载:http://v_july_/),故此,常有朋友留言或来信询问后面40题的答案。
只是因个人认为:一、答案只是作为一个参考,不可太过依赖;二、常常因一些事情耽搁(如在整理最新的今年九月、十月份的面试题:九月腾讯,创新工场,淘宝等公司最新面试十三题、十月百度,阿里巴巴,迅雷搜狗最新面试十一题);三、个人正在针对那100题一题一题的写文章,多种思路,不断优化,即成程序员编程艺术系列(详情,参见文末)。
自此,后面40题的答案迟迟未得整理。
且个人已经整理的前60题的答案,在我看来,是有诸多问题与弊端的,甚至很多答案都是错误的。
(微软10题永久讨论地址:/u/20101126/10/b4f12a00-6280-492f-b785-cb6835a63dc9_9.html)互联网总是能给人带来惊喜。
前几日,一位现居美国加州的名叫阿财的朋友发来一封邮件,并把他自己做的全部100题的答案一并发予给我,自此,便似遇见了知己。
十分感谢。
任何东西只有分享出来才更显其价值。
本只需贴出后面40题的答案,因为前60题的答案本人早已整理上传至网上,但多一种思路多一种参考亦未尝不可。
微软的面试题及答案(超变态但很经典)
第⼀组题答案: 1)三根绳,第⼀根点燃两端,第⼆根点燃⼀端,第三根不点,第⼀根绳烧完(30分钟)后,点燃第⼆根绳的另⼀端,第⼆根绳烧完(45分钟)后,点燃第三根绳⼦两端,第三根绳烧完(1⼩时15分)后,计时完成 2)根据抽屉原理,4个 3)3升装满;3升-〉5升(全注⼊);3升装满;3升-〉5升(剩1升);5升倒掉;3升-〉5升(注⼊1升);3升装满;3升-〉5升;完成(另:可⽤回溯法编程求解) 4)问其中⼀⼈:另外⼀个⼈会说哪⼀条路是通往诚实国的?回答者所指的那条路必然是通往说谎国的。
5)12个球: 第⼀次:4,4 如果平了:那么剩下的球中取3放左边,取3个好球放右边,称:如果左边重,那么取两个球称⼀下,哪个重哪个是次品,平的话第三个重,是次品,轻的话同理,如果平了,那么剩下⼀个次品,还可根据需要称出次品⽐正品轻或者重,如果不平:那么不妨设左边重右边轻,为了便于说明,将左边4颗称为重球,右边4颗称为轻球,剩下4颗称为好球,取重球2颗,轻球2颗放在左侧,右侧放3颗好球和⼀颗轻球,如果左边重,称那两颗重球,重的⼀个次品,平的话右边轻球次品。
如果右边重,称左边两颗轻球,轻的⼀个次品。
如果平,称剩下两颗重球,重的⼀个次品,平的话剩下那颗轻球次品 13个球: 第⼀次:4,4,如果平了。
剩5颗球⽤上⾯的⽅法仍旧能找出次品,只是不能知道次品是重是轻。
如果不平,同上 6) o o o o o o o o o 7) 23次,因为分针要转24圈,时针才能转1圈,⽽分针和时针重合两次之间的间隔显然>1⼩时,它们有23次重合机会,每次重合中秒针有⼀次重合机会,所以是23次 重合时间可以对照⼿表求出,也可列⽅程求出 8) 在地球表⾯种树,做⼀个地球内接的正四⾯体,内接点即为所求 第⼆组⽆标准答案 第三组 1. 分成1,2,4三段,第⼀天给1,第⼆天给2取回1,第3天给1,第4天给4取回1、2,第5天给1,第6天给2取回1,第七天给1 2. 求出⽕车相遇时间,鸟速乘以时间就是鸟飞⾏的距离 3. 四个罐⼦中分别取1,2,3,4颗药丸,称出⽐正常重多少,即可判断出那个罐⼦的药被污染 4. 三个开关分别:关,开,开10分钟,然后进屋,暗且凉的为开关1控制的灯,亮的为开关2控制的灯,暗且热的为开关3控制的灯 5. 因为可以⽤1,2,5,10组合成任何需要的货币值,⽇常习惯为10进制 6. 题意不理解...*_* 7. 012345 0126(9)78 第四组都是很难的题⽬ 第⼀题:97 0 1 2 0 或者 97 0 1 0 2 (提⽰:可⽤逆推法求出) 第⼆题:3架飞机5架次,飞法: ABC 3架同时起飞,1/8处,C给AB加满油,C返航,1/4处,B给A加满油,B返航,A到达1/2处,C从机场往另⼀⽅向起飞,3/4处,C同已经空油箱的A平质S嘤⼟浚 盉从机场起飞,AC到7/8处同B平分剩余油量,刚好3架飞机同时返航。
数据结构经典面试题
数据结构经典面试题
1. 实现一个单链表的反转。
2. 给定两个已排序的链表,合并它们并保持有序。
3. 实现一个栈,要求具备push和pop操作,并支持获取当前栈中的最小元素。
4. 给定一个二叉树,判断它是否是平衡二叉树。
5. 实现一个队列,要求具备入队、出队和获取队列中最大元素的操作。
6. 给定一个整数数组和一个目标值,找出数组中是否存在两个元素的和等于目标值,并返回这两个元素的索引。
7. 实现一个快速排序算法。
8. 给定一个字符串,判断它是否是回文串。
9. 实现一个LRU缓存淘汰算法。
10. 给定一个有序数组和一个目标值,使用二分查找算法在数组中找到目标值的索引,并返回该索引。
微软等公司数据结构+算法面试100 前40(附答案)
//此刻 push 进 A 的元素1小于 B 中
push 第一个元素进 A,也把它 push 进 B, 当向 Apush 的元素比 B 中的元素小, 则也 push 进 B,即更新 B。否则,不动 B,保存原值。 向栈 A push 元素时,顺序由下至上。 辅助栈 B 中,始终保存着最小的元素。
5
然后,pop 栈 A 中元素,5 A B ->更新 4: 5 1 1 3: 1 1 2 2: 4 2 2 1: 0: 6 2 2 2 2 NULL
6
return sum; } int main() { int a[10]={1,-8,6,3,-1,5,7,-2,0,1}; cout<<maxSum(a,10)<<endl; return 0; } 运行结果,如下: 20 Press any key to continue ------------------------------------------------------------
8
} return sum; } void main() { //int a[]={1, 2, 3, 10, 4, 7, 2, 5};// int a[]={1, -2, 3, 10, -4, 7, 2, -5}; //int a[]={-1, -2, -3, -10, -4, -7, -2, -5}; printf("\n%d\n",maxSum(a,8第3题,有网友提出,说以上的解答, 没有给出如果数组中全部为负数的情况,的解决方案。 的确,我一直把,题目限定了是既有负数也有正数的,不考虑全部为负数的情况。 当然,若考虑如果数组,全部为负数,解决方案如下(网友给出的答案,未作测试) : int maxSum(int* a, int n) { int sum=0; int b=0; //针对数组全部为负数的判断。 int nTemp=a[0]; for(int j=1; j<n; j++) { if (nTemp<a[j]) nTemp=a[j]; } if (nTemp<0) return nTemp; for(int i=0; i<n; i++) { if(b<0) b=a[i]; else b+=a[i]; if(sum<b) sum=b;
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;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);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、输出一个字符串所有排列。
应届生数据结构面试题
应届生数据结构面试题以下是一些应届生在数据结构面试中可能会遇到的常见问题和题目:1.数组相关:-如何在数组中查找一个元素?-如何在已排序的数组中进行二分查找?-如何在数组中删除重复的元素?2.链表相关:-什么是链表?如何实现链表?-如何反转一个链表?-如何检测链表中是否存在环?3.栈和队列相关:-什么是栈和队列?它们有什么区别?-如何使用栈实现括号匹配?-如何使用队列实现栈?4.树和二叉树相关:-什么是树和二叉树?它们的特点是什么?-如何遍历一棵二叉树,包括前序、中序和后序遍历?-如何判断两棵二叉树是否相同或镜像对称?5.图相关:-什么是图?有哪些常见的图的表示方法?-如何实现图的深度优先搜索(DFS)和广度优先搜索(BFS)?-如何判断一个图是否是连通图或有向无环图(DAG)?6.排序和搜索算法:-介绍一下常见的排序算法,如冒泡排序、插入排序、快速排序等。
-介绍一下常见的搜索算法,如线性搜索、二分搜索、哈希表等。
7.动态规划和贪心算法:-什么是动态规划和贪心算法?它们的特点和应用场景是什么?-举例说明一个使用动态规划或贪心算法解决的问题。
8.复杂度分析:-什么是时间复杂度和空间复杂度?如何计算它们?-分析几个常见算法的复杂度,如快速排序、二分查找等。
以上仅是一些可能出现的题目示例,实际面试中可能根据公司或岗位的需求有所不同。
在准备面试时,建议深入学习数据结构的基本概念和常用算法,并进行反复的练习和实践。
另外,理解问题的本质和思考解决方案的效率也是非常重要的。
最重要的是保持自信和积极的心态,在面试过程中展示自己的学习能力和问题解决能力。
数据结构面试题(含答案)
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.数据库保护分为:安全性控制、完整性控制、并发性控制和数据的恢复。
微软的22道数据结构算法面试题
rel=alternate><LINK title=RSD href=&uot;/AlexLiu/rsd.xml&uot;
type=application/rsd+xml rel=EditURI>
<SCRIPT src=&uot;微软的22道数据结构算法面试题(含答案) - Alex iPhone 之旅 - 博客园.files/juery.js&uot;
type=text/javascript></SCRIPT>
<SCRIPT src=&uot;微软的22道数据结构算法面试题(含答案) - Alex iPhone 之旅 - 博客园.files/common.js&uot;
type=text/javascript></SCRIPT>
<SCRIPT
src=&uot;微软的22道数据结构算法面试题(含答案) - Alex iPhone 之旅 - 博客园.files/juery.json-2.2.min.js&uot;
type=text/javascript></SCRIPT>
<META content=&uot;MSHTML 6.00.2900.5897&uot; name=GENERATOR></HEAD>
微软面试100题及答案
微软面试100题及答案【篇一:微软技术面试100题答案1】p class=txt>1.把二元查找树转变成排序的双向链表(树)题目:输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表。
要求不能创建任何新的结点,只调整指针的指向。
10/ /6 14/ / / /4 8 12 16转换成双向链表4=6=8=10=12=14=16。
首先我们定义的二元查找树节点的数据结构如下:struct bstreenode{int m_nvalue; // value of nodebstreenode *m_pleft; // left child of nodebstreenode *m_pright; // right child of node};sorehead:第一题:基本就是采用一次遍历即可,楼主采用的是递归方法。
但有两个建议:1、函数里面最好不好使用全局变量,采用参数传递的方式可能更好。
全局变量能少用就少用。
2、if (null == pcurrent)这种方式我也不是很推荐。
我知道采用这种方式的好处是一旦少写了一个等号,编译器会报错,null不是一个合法左值。
其实我最开始写代码时也是这么写的,很长时间都觉得挺好。
但这有个悖论,就是一个开发者能够想起来这么写的时候,这说明他知道这么是要做等值判断,自然也会知道该写==而不是=,想不起来的时候自然也就该犯错误还是犯错误,并不能起到原本初衷。
代码写多了,会发现这么写真有点多此一举。
july关于第一题,我再多说点:我们可以中序遍历整棵树。
按照这个方式遍历树,比较小的结点先访问。
如果我们每访问一个结点,假设之前访问过的结点已经调整成一个排序双向链表,我们再把调整当前结点的指针将其链接到链表的末尾。
当所有结点都访问过之后,整棵树也就转换成一个排序双向链表了。
view plaincopy to clipboard? // 遍历二元查找树中序??????????????????????????????????????????????????? { if (null == pcurrent) {return; } if (null != pcurrent-m_pleft) { ergodicbstree(pcurrent-m_pleft); } // 节点接到链表尾部converttodoublelist(pcurrent); // 右子树为空 if (null != pcurrent-m_pright) { ergodicbstree(pcurrent-m_pright); }}// 二叉树转换成listvoid converttodoublelist(bstreenode * pcurrent){ pcurrent-m_pleft = plistindex; if (null != plistindex) { plistindex-m_pright = pcurrent; } else??????????phead = pcurrent; } plistindex = pcurrent; coutpcurrent-m_nvalueendl;}或者网友何海涛所述:view plaincopy to clipboard???????????????????????????????????????? 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); // put the current node into the double-linked list pcurrent-m_pleft = plastnodeinlist; if(plastnodeinlist != null)plastnodeinlist-m_pright = pcurrent;plastnodeinlist = pcurrent; // convert the right sub-treeif (pcurrent-m_pright !=null)convertnode(pcurrent-m_pright, plastnodeinlist);}?????????????????????? bstreenode* convert_solution1(bstreenode* pheadoftree){bstreenode *plastnodeinlist =null;convertnode(pheadoftree, plastnodeinlist); // get the head of the double-linked listbstreenode *pheadoflist = plastnodeinlist;while(pheadoflist pheadoflist-m_pleft)pheadoflist = pheadoflist-m_pleft;return pheadoflist;}但显然,以下这种思路更容易理解些:view plaincopy to clipboard ???????????????????????????????? bstreenode* convertnode(bstreenode* pnode, bool asright){if(!pnode)return null;bstreenode *pleft =null;bstreenode *pright = null;// convert the left sub-treeif(pnode-m_pleft)pleft = convertnode(pnode-m_pleft, false);// connect the greatest node in the left sub-tree to the current nodeif(pleft){pleft-m_pright = pnode;?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ?????? }// convert the right sub-treeif(pnode-m_pright)pright = convertnode(pnode-m_pright, true);// connect the least node in the right sub-tree to the current nodeif(pright){pnode-m_pright = pright;pright-m_pleft = pnode;}bstreenode *ptemp = pnode;//if the current node is the right child of its parent, // return the least node in the tree whose root is the currentnodeif(asright){while(ptemp-m_pleft)ptemp = ptemp-m_pleft;}// if the current node is the left child of its parent, // return the greatest node in the tree whose root is the currentnodeelse{while(ptemp-m_pright)ptemp = ptemp-m_pright;}【篇二:微软面试100题】ss=txt>题目:输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表。
精选微软等公司算法面试100
41.求固晶机的晶元查找程序晶元盘由数目不详的大小一样的晶元组成,晶元并不一定全布满晶元盘,照相机每次这能匹配一个晶元,如匹配过,则拾取该晶元,若匹配不过,照相机则按测好的晶元间距移到下一个位置。
求遍历晶元盘的算法求思路。
42.请修改append函数,利用这个函数实现:两个非降序链表的并集,1->2->3 和2->3->5 并为1->2->3->5另外只能输出结果,不能修改两个链表的数据。
43.递归和非递归俩种方法实现二叉树的前序遍历。
44.腾讯面试题:1.设计一个魔方(六面)的程序。
2.有一千万条短信,有重复,以文本文件的形式保存,一行一条,有重复。
请用5分钟时间,找出重复出现最多的前10条。
3.收藏了1万条url,现在给你一条url,如何找出相似的url。
(面试官不解释何为相似)45.雅虎:1.对于一个整数矩阵,存在一种运算,对矩阵中任意元素加一时,需要其相邻(上下左右)某一个元素也加一,现给出一正数矩阵,判断其是否能够由一个全零矩阵经过上述运算得到。
2.一个整数数组,长度为n,将其分为m份,使各份的和相等,求m的最大值比如{3,2,4,3,6} 可以分成{3,2,4,3,6} m=1;{3,6}{2,4,3} m=2{3,3}{2,4}{6} m=3 所以m的最大值为346.搜狐:四对括号可以有多少种匹配排列方式?比如两对括号可以有两种:()()和(())47.创新工场:求一个数组的最长递减子序列比如{9,4,3,2,5,4,3,2}的最长递减子序列为{9,5,4,3,2}48.微软:一个数组是由一个递减数列左移若干位形成的,比如{4,3,2,1,6,5}是由{6,5,4,3,2,1}左移两位形成的,在这种数组中查找某一个数。
49.一道看上去很吓人的算法面试题:如何对n个数进行排序,要求时间复杂度O(n),空间复杂度O(1)50.网易有道笔试:1.求一个二叉树中任意两个节点间的最大距离,两个节点的距离的定义是这两个节点间边的个数,比如某个孩子节点和父节点间的距离是1,和相邻兄弟节点间的距离是2,优化时间空间复杂度。
微软公司面试100题(数据结构+算法)
[整理III]微软等公司数据结构+算法面试第1-100题汇总---首次一次性汇总公布1.把二元查找树转变成排序的双向链表题目:输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表。
要求不能创建任何新的结点,只调整指针的指向。
10/ \6 14/ \ / \4 8 12 16转换成双向链表4=6=8=10=12=14=16。
首先我们定义的二元查找树节点的数据结构如下:struct BSTreeNode{int m_nV alue; // value of nodeBSTreeNode *m_pLeft; // left child of nodeBSTreeNode *m_pRight; // right child of node};2.设计包含min函数的栈。
定义栈的数据结构,要求添加一个min函数,能够得到栈的最小元素。
要求函数min、push以及pop的时间复杂度都是O(1)。
3.求子数组的最大和题目:输入一个整形数组,数组里有正数也有负数。
数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。
求所有子数组的和的最大值。
要求时间复杂度为O(n)。
例如输入的数组为1, -2, 3, 10, -4, 7, 2, -5,和最大的子数组为3, 10, -4, 7, 2,因此输出为该子数组的和18。
4.在二元树中找出和为某一值的所有路径题目:输入一个整数和一棵二元树。
从树的根结点开始往下访问一直到叶结点所经过的所有结点形成一条路径。
打印出和与输入整数相等的所有路径。
例如输入整数22和如下二元树10/ \5 12/ \4 7则打印出两条路径:10, 12和10, 5, 7。
二元树节点的数据结构定义为:struct BinaryTreeNode // a node in the binary tree{int m_nV alue; // value of nodeBinaryTreeNode *m_pLeft; // left child of nodeBinaryTreeNode *m_pRight; // right child of node};5.查找最小的k个元素题目:输入n个整数,输出其中最小的k个。
微软面试题及答案
第一组1.烧一根不均匀的绳,从头烧到尾总共需要1个小时。
现在有若干条材质相同的绳子,问如何用烧绳的方法来计时一个小时十五分钟呢?2.你有一桶果冻,其中有黄色、绿色、红色三种,闭上眼睛抓取同种颜色的两个。
抓取多少个就可以确定你肯定有两个同一颜色的果冻?3.如果你有无穷多的水,一个3公升的提捅,一个5公升的提捅,两只提捅形状上下都不均匀,问你如何才能准确称出4公升的水?4.一个岔路口分别通向诚实国和说谎国。
来了两个人,已知一个是诚实国的,另一个是说谎国的。
诚实国永远说实话,说谎国永远说谎话。
现在你要去说谎国,但不知道应该走哪条路,需要问这两个人。
请问应该怎么问?5.12个球一个天平,现知道只有一个和其它的重量不同,问怎样称才能用三次就找到那个球。
13个呢?(注意此题并未说明那个球的重量是轻是重,所以需要仔细考虑)6.在9个点上画10条直线,要求每条直线上至少有三个点?7.在一天的24小时之中,时钟的时针、分针和秒针完全重合在一起的时候有几次?都分别是什么时间?你怎样算出来的?8.怎么样种植4棵树木,使其中任意两棵树的距离相等?第二组1.为什么下水道的盖子是圆的?2.中国有多少辆汽车?3.将汽车钥匙插入车门,向哪个方向旋转就可以打开车锁?4.如果你要去掉中国的34个省(含自治区、直辖市和港澳特区及台湾省)中的任何一个,你会去掉哪一个,为什么?5.多少个加油站才能满足中国的所有汽车?6.想象你站在镜子前,请问,为什么镜子中的影象可以颠倒左右,却不能颠倒上下?7.为什么在任何旅馆里,你打开热水,热水都会瞬间倾泻而出?8.你怎样将Excel的用法解释给你的奶奶听?9.你怎样重新改进和设计一个ATM银行自动取款机?10.如果你不得不重新学习一种新的计算机语言,你打算怎样着手来开始?11.如果你的生涯规划中打算在5年内受到奖励,那获取该项奖励的动机是什么?观众是谁?12.如果微软告诉你,我们打算投资五百万美元来启动你的投资计划,你将开始什么样商业计划?为什么?13.如果你能够将全世界的电脑厂商集合在一个办公室里,然后告诉他们将被强迫做一件事,那件事将是什么?第三组1.你让工人为你工作7天,回报是一根金条,这个金条平分成相连的7段,你必须在每天结束的时候给他们一段金条。
微软面试题目和答案(3篇)
第1篇一、编程题目题目:实现一个函数,给定一个整数数组,返回该数组的中间值。
如果数组长度为奇数,返回中间值;如果为偶数,返回中间两个值的平均值。
答案:```pythondef find_middle_value(nums):nums.sort()n = len(nums)if n % 2 == 1:return nums[n // 2]else:return (nums[n // 2 - 1] + nums[n // 2]) / 2测试代码print(find_middle_value([1, 3, 2])) 输出 2print(find_middle_value([1, 2, 3, 4])) 输出 2.5```解析:1. 首先,对数组进行排序,确保中间值或中间两个值能够正确获取。
2. 判断数组长度是奇数还是偶数。
3. 如果是奇数,返回中间位置的元素。
4. 如果是偶数,返回中间两个元素的平均值。
二、系统设计题目题目:设计一个用户上传文件的系统,包括上传、存储和下载功能。
要求考虑高并发场景下的性能优化。
答案:1. 上传功能:- 使用HTTP长连接进行文件上传,减少建立连接的开销。
- 采用分片上传技术,将大文件分割成多个小片段,逐个上传,提高上传速度和容错能力。
2. 存储功能:- 使用分布式文件系统(如HDFS)存储文件,提高存储的可靠性和扩展性。
- 对文件进行哈希分片,确保每个文件片段存储在不同的存储节点上,避免单点故障。
3. 下载功能:- 使用HTTP长连接进行文件下载,减少建立连接的开销。
- 采用断点续传技术,允许用户在下载过程中暂停,之后从上次断点继续下载。
4. 性能优化:- 使用缓存技术,缓存热点文件,减少对存储系统的访问压力。
- 对上传和下载请求进行限流,防止系统过载。
- 使用负载均衡技术,将请求分发到不同的服务器节点,提高系统并发处理能力。
三、算法题目题目:实现一个函数,判断一个链表是否为回文链表。
数据结构常见面试题
数据结构常见面试题数据结构是计算机科学中非常重要的一个概念。
在面试中,经常会涉及到与数据结构相关的问题。
以下是几个常见的面试题以及参考内容。
1. 什么是数据结构?数据结构是指计算机中组织和存储数据的方式。
常见的数据结构包括数组、链表、栈、队列、树、图等。
数据结构可以帮助我们高效地处理和操作数据。
2. 请介绍一下数组和链表的区别。
数组和链表都是线性数据结构,但它们有着一些重要的区别。
数组是一种连续存储数据的结构,可以通过索引快速访问元素,但插入和删除元素时需要移动其他元素,时间复杂度较高。
链表是由节点组成的,每个节点保存了数据和指向下一个节点的指针,插入和删除元素时只需要修改指针,时间复杂度较低。
3. 请解释栈和队列的概念和特点。
栈(Stack)和队列(Queue)是两种常用的数据结构。
栈是一种后进先出(LIFO)的数据结构,只能在栈顶进行插入和删除操作。
队列是一种先进先出(FIFO)的数据结构,可以在队尾插入元素,在队头删除元素。
栈和队列都可以使用数组或链表实现。
4. 请介绍一下常见的树结构。
树是一种非线性的数据结构,由节点和连接节点的边组成。
常见的树结构包括二叉树、二叉搜索树、平衡二叉树和堆。
二叉树每个节点最多有两个子节点;二叉搜索树的左子节点小于当前节点,右子节点大于当前节点;平衡二叉树保持左右子树高度差不超过1;堆是一种特殊的树,可以迅速找到最大(最小)元素。
5. 请介绍一下图的概念和常见的图算法。
图是由节点和连接节点的边组成的一种非线性数据结构。
常见的图算法包括深度优先搜索(DFS)和广度优先搜索(BFS)。
DFS使用递归或栈来遍历图,先访问根节点,然后逐个访问子节点。
BFS使用队列来遍历图,先访问根节点,然后按层遍历子节点。
6. 请介绍一下哈希表的概念和应用。
哈希表是一种根据关键字直接访问数据的数据结构。
它通过哈希函数将关键字映射到固定大小的数组中,并将数据存储在对应位置。
哈希表具有快速查找的特点,适用于需要频繁查找的场景,如字典、缓存等。
经典的微软面试题目及参考答案
经典的微软面试题目及参考答案经典的面试题目是微软求职者求职面试成功的开路先锋,对面试题目的回答直接影响微软求职者的面试成败。
下面是店铺为大家精心推荐的经典的微软面试题,希望能够对您有所帮助。
经典的微软面试题(一)1、烧一根不均匀的绳,从头烧到尾总共需要1个小时。
现在有若干条材质相同的绳子,问如何用烧绳的方法来计时一个小时十五分钟呢?2、你有一桶果冻,其中有黄色、绿色、红色三种,闭上眼睛抓取同种颜色的两个。
抓取多少个就可以确定你肯定有两个同一颜色的果冻?3、如果你有无穷多的水,一个3公升的提捅,一个5公升的提捅,两只提捅形状上下都不均匀,问你如何才能准确称出4公升的水?4、一个岔路口分别通向诚实国和说谎国。
来了两个人,已知一个是诚实国的,另一个是说谎国的。
诚实国永远说实话,说谎国永远说谎话。
现在你要去说谎国,但不知道应该走哪条路,需要问这两个人。
请问应该怎么问?5、12个球一个天平,现知道只有一个和其它的重量不同,问怎样称才能用三次就找到那个球。
13个呢?(注意此题并未说明那个球的重量是轻是重,所以需要仔细考虑)6、在9个点上画10条直线,要求每条直线上至少有三个点?7、在一天的24小时之中,时钟的时针、分针和秒针完全重合在一起的时候有几次?都分别是什么时间?你怎样算出来的?8、怎么样种植4棵树木,使其中任意两棵树的距离相等?经典的微软面试题(二)1、为什么下水道的盖子是圆的?2、中国有多少辆汽车?3、将汽车钥匙插入车门,向哪个方向旋转就可以打开车锁?4、如果你要去掉中国的34个省(含自治区、直辖市和港澳特区及台湾省)中的任何一个,你会去掉哪一个,为什么?5、多少个加油站才能满足中国的所有汽车?6、想象你站在镜子前,请问,为什么镜子中的影象可以颠倒左右,却不能颠倒上下?7、为什么在任何旅馆里,你打开热水,热水都会瞬间倾泻而出?8、你怎样将Excel的用法解释给你的奶奶听?9、你怎样重新改进和设计一个ATM银行自动取款机?10、如果你不得不重新学习一种新的计算机语言,你打算怎样着手来开始?11、如果你的生涯规划中打算在5年内受到奖励,那获取该项奖励的动机是什么?观众是谁?12、如果微软告诉你,我们打算投资五百万美元来启动你的投资计划,你将开始什么样商业计划?为什么?13、如果你能够将全世界的电脑厂商集合在一个办公室里,然后告诉他们将被强迫做一件事,那件事将是什么?经典的微软面试题(三)1、你让工人为你工作7天,回报是一根金条,这个金条平分成相连的7段,你必须在每天结束的时候给他们一段金条。
面试_微软面试100题全部答案
本文自CSDN大牛的一篇博客:/v_july_v/article/details/6870251作者:July、阿财时间:二零一一年十月十三日。
我能够看到此文,还要多同学!让我得以及时分享给大家微软面试100题全部答案个人整理的前60题的答案可参见以下三篇文章:1.微软100题第1题-20题答案/v_JULY_v/archive/2011/01/10/6126406.aspx [博文 I]2.微软100题第21-40题答案/v_JULY_v/archive/2011/01/10/6126444.aspx[博文II]3.微软100题第41-60题答案/v_JULY_v/archive/2011/02/01/6171539.aspx[博文III]最新整理的全部100题的答案参见如下(重复的,以及一些无关紧要的题目跳过):1.把二元查找树转变成排序的双向链表题目:输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表。
要求不能创建任何新的结点,只调整指针的指向。
10/ \6 14/ \ / \4 8 12 16转换成双向链表4=6=8=10=12=14=16。
首先我们定义的二元查找树节点的数据结构如下:struct BSTreeNode{int m_nValue; // value of nodeBSTreeNode *m_pLeft; // left child of nodeBSTreeNode *m_pRight; // right child of node};ANSWER:This is a traditional problem that can be solved using recursion.For each node, connect the double linked lists created from left and right child node to form a full list./*** param root The root node of the tree* return The head node of the converted list.*/BSTreeNode * treeToLinkedList(BSTreeNode * root) {BSTreeNode * head, * tail;helper(head, tail, root);return head;}void helper(BSTreeNode *& head, BSTreeNode *& tail, BSTreeNode *root) {BSTreeNode *lt, *rh;if (root == NULL) {head = NULL, tail = NULL;return;}helper(head, lt, root->m_pLeft);helper(rh, tail, root->m_pRight);if (lt!=NULL) {lt->m_pRight = root;root->m_pLeft = lt;} else {head = root;}if (rh!=NULL) {root->m_pRight=rh;rh->m_pLeft = root;} else {tail = root;}}2.设计包含min 函数的栈。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
面试微软必备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;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 {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<n;++j){6 if(j!=0 && s[j]==s[j-1]);7 elseif(s[j]!='@'){8 p[i]=s[j];9 s[j]='@';10 if(i==n-1){11 p[n]='\0';12 printf("%s", p);13 }else{14 perm(s,i+1,n);15 }16 s[j]=p[i];17 }18 }19}--------------------------1void main() {2 char s[N];3 sort(s);4 perm(s,0,strlen(s));5}5、输入一个字符串,输出长型整数。
1 long atol(char *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;14}6、判断一个链表是否有循环。
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 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) {6 tmp = char [i];7 str[i] = str[len - i - 1 ];8 str[len - i - 1 ] = tmp;9 }10 }8、实现strstr函数。
1int strstr(char[] str, char[] par){2 int i=0;3 int j=0;4 while(str[i] && str[j]){5 if(str[i]==par[j]){6 ++i;7 ++j;8 }else{9 i=i-j+1;10 j=0;11 }12 }13 if(!str[j]) return i-strlen(par);14 else return -1;15}9、实现strcmp函数。
1int strcmp(char* str1, char* str2){2 while(*str1 && *str2 && *str1==*str2){3 ++str1;4 ++str2;5 }6 return *str1-*str2;7}10、求一个整形中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 }8}12、三柱汉诺塔最小步数。
1 int f3(n) {2 if (f3[n]) return f3[n];3 else {4 if (n == 1 ) {5 f3[n] = 1 ;6 return 1 ;7 }8 f3[n] = 2 * f3(n - 1 ) + 1 ;9 return f3[n];10 }11 }四柱汉诺塔最小步数。
1int f4(n){2 if(f4[n]==0){3 if(n==1) {4 f4[1]==1;5 return 1;6 }7 min=2*f4(1)+f3(n-1);8 for(int i=2;i<n;++i){9 u=2*f4(i)+f3(n-i);10 if(u<min) min=u;11 }12 f4[n]=min;13 return min;14 } else return f4[n];15}13、在一个链表中删除另一个链表中的元素。
1void delete(List m, List n) {2 if(!m || !n) return;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) {8 a=a.next;9 pre=pre.next;10 }else if(a.value > b.value){11 b=b.next;12 }else{13 a=a.next;14 pre.next=a;15 }16 }17 m=head.next;18}14、一个数组,下标从0到n,元素为从0到n的整数。
判断其中是否有重复元素。
1int hasDuplicate(int[] a, int n){2 for(int i=0;i<n;++i){3 while(a[i]!=i && a[i]!=-1){4 if(a[a[i]]==-1) return 1;5 a[i]=a[a[i]];6 a[a[i]]=-1;7 }8 if(a[i]==i) {a[i]=-1;}9 }10 return 0;11}15、判断一颗二叉树是否平衡。
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 || left -ri ght >=-1)6 return (left<right)? (right +1) : (left + 1);7 else return -1;8}916、返回一颗二叉树的深度。
1int depth(Tree t){2 if(!t) return 0;3 else {4 int a=depth(t.right);5 int b=depth(t.left);6 return (a>b)?(a+1):(b+1);7 }8}17、两个链表,一升一降。
合并为一个升序链表。
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 }18、将长型转换为字符串。