微软面试中简单算法题目Word版
微软校招考试题目及答案
微软校招考试题目及答案### 1. 编程题:字符串反转**题目描述:**给定一个字符串,请编写一个函数来反转这个字符串。
**输入:** 一个字符串 `s`。
**输出:** 反转后的字符串。
**示例:**输入:`"hello"`输出:`"olleh"`**答案:**```pythondef reverse_string(s):return s[::-1]# 测试代码print(reverse_string("hello")) # 输出: "olleh" ```## 2. 数据结构题:二叉树的深度**题目描述:**给定一个二叉树,请找出其最大深度。
**输入:** 二叉树的根节点 `root`。
**输出:** 二叉树的最大深度。
**答案:**```pythonclass TreeNode:def __init__(self, val=0, left=None, right=None): self.val = valself.left = leftself.right = rightdef maxDepth(root):if not root:return 0else:left_depth = maxDepth(root.left)right_depth = maxDepth(root.right)return max(left_depth, right_depth) + 1# 测试代码# 构建一个简单的二叉树# 1# / \# 2 3# / \# 4 5root = TreeNode(1)root.left = TreeNode(2)root.right = TreeNode(3)root.left.left = TreeNode(4)root.left.right = TreeNode(5)print(maxDepth(root)) # 输出: 3```## 3. 算法题:无重复字符的最长子串**题目描述:**给定一个字符串,请找出其中不含有重复字符的最长子串的长度。
微软等公司数据结构+算法面试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.烧一根不均匀的绳,从头烧到尾总共需要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段,你必须在每天结束的时候给他们一段金条。
面试微软必备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);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、输出一个字符串所有排列。
四道微软面试算法题
四道微软面试算法题
(1)一个整数数列,元素取值可能是0—65535中的任意一个数,相同数值不会重复出现。
0是例外,可以反复出现。
请设计一个算法,当你从该数列中随意选取5个数值,判断这5个数值是否连续相邻。
注意:
-5个数值允许是乱序的。
比如:87506;
-0可以通配任意数值。
比如:87506中的0可以通配成9或者4;
-0可以多次出现;
-复杂度如果是O(n2)则不得分。
(2)设计一个算法,找出二叉树上任意两个结点的最近共同父结点,复杂度如果是O(n2)则不得分。
(3)一棵排序二叉树,令f=(最大值+最小值)/2,设计一个算法,找出距离f值最近、大于f值的结点。
复杂度如果是O(n2)则不得分。
(4)一个整数数列,元素取值可能是1~N(N是一个较大的正整数)中的任意一个数,相同数值不会重复出现。
设计一个算法,找出数列中符合条件的数对的个数,满足数对中两数的和等于N+1。
复杂度最好是O(n),如果是O(n2)则不得分。
微软面试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,优化时间空间复杂度。
微软Microsoft经典面试测试题和参考答案
微软Microsoft经典面试测试题和参考答案第一组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段,你必须在每天结束的时候给他们一段金条。
微软面试题及答案
微软面试题及答案〔很需要开放性思维啊〕第一组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段,你必须在每天完毕的时候给他们一段金条。
微软面试题13道题目(3篇)
第1篇一、最基本题型1. 题目:从1到100有多少个9?解答思路:这个问题考察的是对数字的敏感度和基本的数学运算能力。
从1到100的数字中,个位和十位上都会出现9,但要注意100这个数字本身不算在内。
我们可以分别计算个位和十位上出现9的次数,然后将两者相加。
解答过程:- 个位上出现9的次数:9, 19, 29, 39, 49, 59, 69, 79, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99,共18次。
- 十位上出现9的次数:90, 91, 92, 93, 94, 95, 96, 97, 98, 99,共10次。
- 总计:18 + 10 = 28次。
2. 题目:连续整数之和为1000的共有几组?解答思路:这个问题需要我们找出所有可能的连续整数序列,它们的和为1000。
可以通过试错法或者数学公式来解决这个问题。
解答过程:- 通过试错法,我们可以找到以下几组连续整数序列:- 1 + 2 + 3 + ... + 33 = 1000- 2 + 3 + 4 + ... + 34 = 1000- 3 + 4 + 5 + ... + 35 = 1000- ...(以此类推)- 总计:共有33组连续整数序列的和为1000。
二、逻辑推理题3. 题目:一个人从一座桥的一端出发,到另一端需要17分钟。
一次最多可以带一个人过桥,过桥时必须持有手电筒。
四个人过桥,他们的过桥速度分别是1分钟、2分钟、5分钟和10分钟。
如何安排他们的过桥顺序,使得总用时最短?解答思路:这个问题考察的是对时间管理能力的理解和优化策略的制定。
解答过程:- 首先,最慢的三个人(速度为10分钟、5分钟和2分钟)一起过桥,用时2分钟。
- 然后,速度为2分钟的人回来,用时2分钟。
- 接着,速度为1分钟的人过桥,用时1分钟。
- 最后,速度为10分钟和5分钟的人一起过桥,用时5分钟。
- 总用时:2 + 2 + 1 + 5 = 10分钟。
微软球队面试题目大全(3篇)
第1篇一、编程与算法题目1. 动态规划问题:- 给定一个整数数组,找到最长连续递增子序列的长度。
- 给定一个数组,找到最长的连续不重复子序列的长度。
2. 树形结构问题:- 给定一个二叉树,判断它是否是平衡的。
- 实现一个前序遍历,中序遍历和后序遍历的非递归版本。
3. 图论问题:- 给定一个加权无向图,找到最短路径。
- 实现一个拓扑排序算法。
4. 字符串处理问题:- 实现KMP算法,用于字符串匹配。
- 给定两个字符串,判断它们是否是同构的。
5. 数组与矩阵问题:- 给定一个整数数组,实现一个有效的快速排序算法。
- 给定一个矩阵,实现一个高效的矩阵转置算法。
6. 数据结构问题:- 实现一个栈,支持基本操作如push、pop、peek。
- 实现一个队列,支持基本操作如enqueue、dequeue、peek。
二、系统设计题目1. 缓存系统设计:- 设计一个缓存系统,支持添加、删除和查询操作。
2. 分布式系统设计:- 设计一个分布式锁,保证同一时间只有一个客户端可以访问资源。
3. 搜索引擎设计:- 设计一个简单的搜索引擎,支持关键词搜索和查询结果排序。
4. 社交网络设计:- 设计一个社交网络,支持用户注册、添加好友、发送消息等功能。
5. 数据库设计:- 设计一个数据库,支持基本的CRUD操作。
三、软技能与行为问题1. 自我介绍:- 请简短地介绍一下你自己。
2. 团队合作:- 请描述一次你在团队中遇到困难并成功解决的经历。
3. 领导力:- 请描述一次你领导团队完成项目的经历。
4. 问题解决能力:- 请描述一次你解决复杂问题的经历。
5. 抗压能力:- 请描述一次你面对压力较大的工作环境的经历。
四、技术问题1. 操作系统:- 描述进程和线程的区别。
- 解释虚拟内存的工作原理。
2. 计算机网络:- 描述TCP和UDP的区别。
- 解释HTTP协议的工作原理。
3. 数据库:- 描述SQL注入攻击,以及如何防止。
- 解释数据库事务的ACID特性。
(完整)微软面试题及答案,推荐文档
微软面试题及答案大全提问:一.最基本题型(说明:此类题型比较简单)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.烧一根不均匀的绳,从头烧到尾总共需要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个球中。
把①⑨与⑩⑾作第二次称量,⒈如相等,说明⑿特别,把①与⑿作第三次称量即可判断是⑿是重还是轻⒉如①⑨<⑩⑾说明要么是⑩⑾中有一个重的,要么⑨是轻的。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
算法题1.链表和数组的区别在哪里?ANSWER 主要在基本概念上的理解。
但是最好能考虑的全面一点,现在公司招人的竞争可能就在细节上产生,谁比较仔细,谁获胜的机会就大。
1)数组在内存中是逐个存放的,也就是说倘若数组的第一个元素在地址A,则数组第二个元素就在地址A+1。
而链表则不是,链表每个节点没有相对固定的位置关系。
某个节点在地址A其后的节点不一定是A+1,而在内存的其他空闲区域,呈现一种随机的状态。
2)数组一旦显式的被申明后,其大小就固定了,不能动态进行扩充。
而链表则可以,可以动态生成节点并且添加到已有的链表后面。
3) …… (大家一起想想)2.编写实现链表排序的一种算法。
说明为什么你会选择用这样的方法?ANSWER 链表通常是插入排序,为什么呢?在数组中插入排序实现时会大量的移动数据从而删除位置不正确的元素,这是顺序表删除操作的低效性。
从数学的角度,顺序表(即数组)的删除操作是O(n).链表就不同,由于其存储位置的不固定性,其删除固定位置的元素只需要O(1)的时间,所以整体性能上获得比较大的提高。
3.编写实现数组排序的一种算法。
说明为什么你会选择用这样的方法?ANSWER 排序算法非常成熟了,实际上排序是研究算法的很有效例子。
回答的时候尽量找一些比较有技术性的算法,比如堆排序或者快速排序,如果写冒泡什么的,别人都会写,也就显示不出你的优秀了。
当然一定要注意给定的条件。
不至于三个数让你排序,你搞个快排,这就有点“宰牛刀杀鸡”了。
4.请编写能直接实现strstr()函数功能的代码。
ANSWER 首先要知道strstr()这个函数是干什么的,自己去查查C语言的书,一般附录后面会给出C语言标准库的。
这个题目实际上也是一类重要的算法门类,叫做“字符串的模式匹配”。
它有很多的现成算法,其中最简单的要数朴素的匹配算法,还有KMP,BM这些高级算法,笔试估计是来不及写的。
下面给出朴素的匹配算法。
int stringMatching(char* pattern,char* text){int pLen = strlen(pattern),tLen = strlen(text);for(int i = 0;i <= tLen - pLen;i++){for(int j = 0; pattern[j] == text[i + j];j++);if(j == pLen) return i;}return -1; // Not found}或者char * strstr(const char *s1,const char *s2){assert((s1 != NULL) && (s2 != NULL);char *t1 = s1;char *t2 = s2;while(*s1 == '0\')while(*t1++ == *t2++);if(*t2 =='0\')return t2;else{t2 = s2;s1++;}return NULL;}5.编写反转字符串的程序,要求优化速度、优化空间。
ANSWER:循环当然是最简单的。
void reverseString(char* str){int n = strlen(str);for(int i = 0;i < n/2;i++){int t = str[i];str[i] = str[n - i - 1];str[n - i - 1] = t;}}6.在链表里如何发现循环链接?ANSWER: 显然只需要判断是否存在回溯指针就行了。
判断,是否存在某个节点的后继指向其前面位置的指针。
具体实现的时候可以模仿DFS中的访问标志数组的方法,我们可以在struct node中设计该节点的一个访问标志位,设为visited 。
每访问一个节点就将其visited域置为1。
这样的话,一次遍历下来,如果发现某个后续节点的visited域已经是1,那么就可以判定其存在循环链接。
具体的代码就不写了,太简单了。
7.写一个函数,检查字符是否是整数,如果是,返回其整数值。
(或者:怎样只用4行代码编写出一个从字符串到长整形的函数?)分析:简单!扫描一遍,每次生成对应整数的最高位。
一行也就搞定了!long convert(char* s_string,long s_integer){for(int sLen = strlen(s_string), i = 0; i < sLen;s_integer +=(s_string[i++] - '0')*pow(10,sLen - i - 1));return s_integer;}8.给出一个函数来输出一个字符串的所有排列。
ANSWER 简单的回溯就可以实现了。
当然排列的产生也有很多种算法,去看看组合数学,还有逆序生成排列和一些不需要递归生成排列的方法。
印象中Knuth的<TAOCP>第一卷里面深入讲了排列的生成。
这些算法的理解需要一定的数学功底,也需要一定的灵感,有兴趣最好看看。
void permStr(char* str,int i){if(i == strlen(str) - 1)printf("%s\n",str);else{for(int j = i;j < strlen(str);j++){swap(&str[i],&str[j]);permStr(str,i + 1);swap(&str[i],&str[j]);}}}9.给出一个函数来复制两个字符串A和B。
字符串A的后几个字节和字符串B的前几个字节重叠。
anSwer 记住,这种题目往往就是考你对边界的考虑情况。
编程除了技术上的熟练以外,细心也是非常重要的。
其实很多编程的大师可能并不是有特别的技术,往往就是他们非常的耐心和细心,记住:编程是计算机科学中最基本的工作,它是最容易去掌握的,耐心点,细心点你一定能够学好它。
代码看下面:char* myStrcpy(char* s,char* a,char* b,char n){int aLen = strlen(a),bLen = strlen(b);if(n > aLen || n > bLen)return NULL; // Errorfor(int i = 0;i < aLen + bLen - n;i++)if(i < aLen - n) s[i] = a[i];else s[i] = b[i - aLen + n];s[i] = '\0';return s;}10.怎样编写一个程序,把一个有序整数数组放到二叉树中?ANSWER :二叉搜索树的建树方法。
简单的递归结构。
实在不理解,干脆记下来好了。
关于树的算法设计一定要联想到递归,因为树本身就是递归的定义。
这里的递归应该是理所当然的吧,不过,学会把递归改称非递归也是一种必要的技术。
毕竟,递归会造成栈溢出,关于系统底层的程序中不到非不得以最好不要用。
但是对某些数学问题,就一定要学会用递归去解决。
void insertNode(bTree** root,int val){bTree* newNode = (bTree* ) malloc(sizeof(bTree));newNode->data = val;newNode->lChild = NULL;newNode->rChild = NULL;if(!(*root))*root = newNode;else if(newNode->data < (*root)->data)insertNode(&(*root)->lChild,val);elseinsertNode(&(*root)->rChild,val);}11.怎样从顶部开始逐层打印二叉树结点数据?请编程。
ANSWER 二叉树的层次遍历没什么好说的,如果你不会还是早点把基础复习一下。
一个劲的往后学,才会发现原来最最重要的还是以前最基础最简单的。
typedef struct myBinaryTree{int data;struct myBinaryTree* lChild;struct myBinaryTree* rChild;} bTree;struct myQueen{bTree* que[QSIZE];int front;int rear;} binQueue; // Global varvoid initQueue(){// front == real makes the queue emptybinQueue.rear = QSIZE - 1;binQueue.front = binQueue.rear;for(int i = 0;i < QSIZE;i++)binQueue.que[i] = NULL;}int enQueue(bTree* newNode){if(binQueue.front >= 1)binQueue.que[binQueue.front--] = newNode;else return 0;return 1;}bTree* deQueue(){int t;if(binQueue.front != binQueue.rear){t = binQueue.rear;binQueue.rear--;return binQueue.que[t];}else return NULL;}int levelTraversal(bTree** root){initQueue();bTree* lc = (bTree* ) malloc(sizeof(bTree));bTree* rc = (bTree* ) malloc(sizeof(bTree));bTree* p = (bTree* ) malloc(sizeof(bTree));if((!lc) || (!rc) || (!p)){printf("OVERFLOW\n");exit(OVERFLOW); // Allocation Error}p = *root;if(!p) {printf("Empty Tree,build it first !\n");return 0;}enQueue(p); // enqueue the root of the treewhile (binQueue.front != binQueue.rear){p = deQueue();printf("%d ",p->data);lc = p->lChild;rc = p->rChild;if(lc != NULL)enQueue(lc);if(rc != NULL)enQueue(rc);}printf("\n");return 1;}12.怎样把一个链表掉个顺序(也就是反序,注意链表的边界条件并考虑空链表)?ANSWER 前面说了,最基本的是最重要的。