面试微软必备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题全部答案集锦(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(附答案)

微软等公司数据结构+算法面试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道数据结构算法面试题

微软的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.数据库保护分为:安全性控制、完整性控制、并发性控制和数据的恢复。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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、将长型转换为字符串。

相关文档
最新文档