微软面试100题及答案
- 格式:docx
- 大小:15.01 KB
- 文档页数:15
微软校招考试题目及答案### 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道题目(2)推荐文章经典的微软面试题目及参考答案热度:微软搞怪的面试题有哪些呢热度:世界500强面试题:微软的面试热度:世界500强面试题:微软公司的智力题热度:世界500强面试题:微软公司的应用题热度:40、你会给失聪的人设计什么样的闹钟?41、如果你有一个许多部件可以拆卸的时钟,你将它一块块拆开,但是没有记住是怎样拆的。
然后你将各个零件重新组装起来,最后发现有三个重要零件没有放进去。
这时你如何重新组装这个时钟?42、如果你需要学习一门新的计算机语言,你会怎样做?43、假设由你负责设计比尔·盖茨的卫生间。
当然,钱不成问题,但是你不可以和比尔谈。
你会怎样做?44、到目前为止,你遇到的最难回答的问题是什么?45、如果微软公司说,我们愿意投资500万美元用来开发你提出的方案。
那么你会做什么?为什么?46、如果你将世界上所有的计算机制造商召集起来,告诉他们必须要做一件事,你会让他们做什么事?47、如果你在五年内会得到一笔奖金,你认为会是因为什么?关注你的成绩的人会是谁?48、你如何教自己的奶奶使用微软excel表格系统?49、为什么当我们在任何一家宾馆打开热水龙头时,热水会马上流出来?50、你为什么想在微软工作?51、假设你回到家,进入自己的房间,打开电灯开关,可是一点反应都没有——灯没有亮。
这时,你在判断问题出在哪里时,会依次采取怎样的做法?52、下列哪项叙述是错误的?(a)主观主义者可能也是相对论者。
(b)相对论者也可能是客观主义者。
(c)绝对论者也可能是主观主义者。
(d)客观主义者也可能是绝对论者。
53、如果就像萨特的存在主义所说的,“人要为自己的热情负责”,那么无论我们做什么,我们都:(a)违背了自己的意愿。
(b)没有经过思考。
(c)是自由的。
(d)是出于对上帝的蔑视。
54、萨特宣称,对人类来说,“存在先于本质”,换言之:(a)当人们理智的时候,他们才符合人类的本质。
创新思维:微软面试题及答案第一组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段,你必须在每天结束的时候给他们一段金条。
世界五百强微软面试题世界五百强微软面试题一、简答题(每题30分,共计150分)1.请简单介绍一下微软公司的发展历程。
2.请简要说明C#与Java的相似点和区别点。
3.请介绍一下面向对象编程的特点以及你对面向对象编程的理解。
4.请阐述一下SQL语言的用途以及你熟悉的SQL语句。
5.请简要介绍一下.NET框架和技术。
二、编程题(每题40分,共计120分)1.编写一个C#程序,实现一个简单的计算器功能,可以进行加减乘除运算。
2.编写一个Java程序,从一个整数数组中找出最大值、最小值和平均值。
3.使用面向对象的思想,设计一个简单的图书管理系统,要求能够实现图书的添加、删除和查询功能。
附加题(每题20分,共计60分)1.请介绍一下微软的人工智能产品和应用领域。
2.请简述一下微软公司在可持续发展方面的努力和成就。
3.请阐述一下你对微软公司文化和价值观的理解,并说明你如何与公司文化相匹配。
提示:可以根据实际情况和个人经验进行回答,注重细节和逻辑性。
有些问题需要进行代码演示或举例说明。
尽量使用简练、准确的语言表达你的观点。
世界五百强微软面试题答案一、简答题答案1. 微软公司的发展历程:微软公司是由比尔·盖茨和保罗·艾伦于1975年创立的。
起初,微软主要从事基于硬件的软件开发。
在20世纪80年代,微软推出了DOS操作系统,并在1985年发布了Windows操作系统,使微软迅速崭露头角。
随后,微软逐渐壮大,推出了许多标志性的产品,如Office办公套件、Internet Explorer浏览器和Windows操作系统的不断升级。
微软公司还积极投身于互联网、云计算、人工智能等领域的研发和创新,不断推动科技进步。
2. C#与Java的相似点和区别点:相似点:- 都是基于面向对象的编程语言,具有丰富的类和对象的概念。
- 都是跨平台的语言,可以在不同的操作系统上运行。
- 都支持垃圾回收机制,自动管理内存。
[整理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个。
微软面试题面试官问答微软面试题:现在我们要问一个问题,看看你的创造性思维能力。
不要想得太多,运用日常生活中的常识,描述一下你的想法。
这个问题是,下水道的井盖为什么是圆的?A:它们并不都是圆的。
有些是方的。
的确有些圆井盖,但我也看过方的,长方的。
微软面试题:不过我们只考虑圆形的井盖,它们为什么是圆的?A:如果我们只考虑圆的,那么它们自然是圆的。
微软面试题:我的意思是,为什么会存在圆的井盖?把井盖设计成圆形的有什么特殊的意义吗?A:是有特殊意义。
当需要覆盖的洞是圆形时,通常盖子也是圆的。
用一个圆形的盖子盖一个圆形的洞,这是最简单的办法。
微软面试题:你能想到一个圆形的井盖比方形的井盖有哪些优点吗?A:在回答这个问题之前,我们先要看看盖子下面是什么。
盖子下面的洞是圆的,因为圆柱形最能承受周围土地的压力。
而且,下水道出入孔意味着要留出足够一个人通过的空间,而一个顺着梯子爬下去的人的横截面基本是圆的。
所以圆形自然而然地成为下水道出入孔的形状。
圆形的井盖只是为了覆盖圆形的洞。
微软面试题:你认为存在安全方面的考虑吗?我的意思是,方形的井盖会不会掉进去,因此造成人身伤害?A:不大可能。
有时在一些方形洞上也会看到方形的盖子。
这种盖子比入大,周围有横档。
通常这种盖子是金属质地,非常重。
我们可以想象一下,两英尺宽的方形洞,1到英寸宽的横档。
为了让井盖掉进去,需要抬起一端,然后旋转30度,这样它就不受横档的妨碍了,然后再将井盖与地平线成45度角,这时转移的重心才足以让井盖掉下去。
是的,井盖的确存在掉下去的可能,但可能性非常小。
只要对负责开井盖的人稍加培训,他就不会犯这样的错误。
从工程学的角度来看,井盖的形状完全取决于它要覆盖的洞的形状。
面试官(面有难色):失陪一下;我要与管理层谈点事情。
(离开了房间)。
微软面试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>题目:输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表。
要求不能创建任何新的结点,只调整指针的指向。
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};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_nvalue; // value of nodebinarytreenode *m_pleft; // left child of nodebinarytreenode *m_pright; // right child of node};5.查找最小的k个元素题目:输入n个整数,输出其中最小的k个。
例如输入1,2,3,4,5,6,7和8这8个数字,则最小的4个数字为1,2,3和4。
第6题------------------------------------腾讯面试题:给你10分钟时间,根据上排给出十个数,在其下排填出对应的十个数要求下排每个数都是先前上排那十个数在下排出现的次数。
上排的十个数如下:【0,1,2,3,4,5,6,7,8,9】初看此题,貌似很难,10分钟过去了,可能有的人,题目都还没看懂。