![](https://img-blog.csdnimg.cn/20201014180756780.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
【微软面试100题】
文章平均质量分 69
chengzhuwei
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
展开
-
第七十九题合集 【微软面试100题 第七十九题】
题目要求: 问题1:编写实现链表排序的一种算法。 问题2:编写实现数组排序的一种算法。 问题3:编写能直接实现strstr()功能的代码。问题分析: 问题1分析: 方法1 首先想到的是冒泡排序,因为简单; 方法2 如果内存空间允许,可以通过一个数组来辅助排序,时间复杂度O(NlogN),但是需要耗费空间复杂度.具体如下:原创 2014-11-24 16:12:48 · 631 阅读 · 0 评论 -
和为s的两个数字 【微软面试100题 第十四题】
题目要求: 输入一个递增排序的数组和一个数字s,在数组中查找两个数,使得它们的和正好是s。如果有多对数字的和等于s,输出任意一对即可。 例如输入数组{1,2,4,7,11,15}和数字15.由于4+11=15,因此输出4和11. 参考资料:剑指offer第41题题目分析: 方法1 穷举法:两个for,时间复杂度O(n^2). 方法2 二分查原创 2014-11-05 14:22:20 · 360 阅读 · 0 评论 -
字符串联接 【微软面试100题 第三十七题】
字符串联接 【微软面试100题 第三十七题】题目要求: 有n个长为m+1的字符串,如果某个字符串的最后m个字符与某个字符串的前m个字符匹配,则两个字符串可以联接。 问这n个字符串最多可以连成一个多长的字符串,如果出现死循环,则返回错误。题目分析: 1.每个字符串都是长为m+1的字符串,两个字符串匹配后长度应该为1+m+1=m+2; 2.用图的思想来解原创 2014-11-05 15:07:09 · 409 阅读 · 0 评论 -
求比赛名次 【微软面试100题 第三十六题】
题目要求: n支队伍比赛,分别编号为0,1,2,...,n-1,已知它们之间的实力对比关系存储在一个二维数组w[n][n]中,w[i][j]的值代表编号为i,j的队伍中更强的一支,所以w[i][j] = i或者j. 现在给出它们的出场顺序,并存储在数组order[n]中,比如order[n] = {4,3,5,8,1......},那么第一轮比赛就是4对3,5对8.胜者晋级,败原创 2014-11-05 15:06:03 · 557 阅读 · 0 评论 -
求一个矩阵中最大的二维矩阵 【微软面试100题 第三十五题】
题目要求: 求一个矩阵中最大的二维矩阵(元素和最大).如: 1 2 0 3 4 2 3 4 5 1 1 1 5 3 0 中最大的是4 5 5 3. 要求:1)写出算法;2)分析时间复杂度;3)写出相关代码。 参考资料:编程之美 2.15题目分析: 从矩阵开头逐原创 2014-11-05 15:05:29 · 566 阅读 · 0 评论 -
实现一个队列 【微软面试100题 第三十四题】
题目要求: 实现一个队列。队列的应用场景是:一个生产者线程将int型的数入列,一个消费者线程将int型的数出列。 参考资料: 编程之美1.10题目分析: 可以按照操作系统中的生产者与消费者模型来实现代码,大致思路如下:void producer(void){ while(1) { item = produce_item();原创 2014-11-05 15:04:08 · 369 阅读 · 0 评论 -
字符串匹配算法 【微软面试100题 第三十三题】
题目要求: 给一串很长字符串,要求找到符合要求的字符串。 例如目的串:123,则1*****3***2,12*****3这些都要找出来。 其实就是类似一些和谐系统。。。。。。题目分析: 1.假如目的串为:"423",输入长字符串为:"4fsdfk2jfl3fd2jfksd3j4d4d4jkfd4jd3kdf2",则应该输出 "4fsdfk2jfl3原创 2014-11-05 15:04:08 · 371 阅读 · 0 评论 -
交换元素,使两数组之和的差最小 【微软面试100题 第三十二题】
题目要求: 有两个序列a,b,大小都为n,序列元素的值任意整数,无序; 要求:通过交换a,b中的元素,使[序列a元素的和]与[序列b元素的和]之间的差最小。 参考资料:程序员编程艺术(By July)题目分析: 先求两个序列和之差diff;然后从a和b中分别取一个元素,利用公式:diff-a[i]+b[j]-(a[i]-b[j]) = diff-2*(原创 2014-11-05 15:02:39 · 604 阅读 · 1 评论 -
在从1到n的正数中1出现的次数 【微软面试100题 第三十题】
题目要求: 给定 一个十进制正整数N,写下从1开始,到N的所有整数,然后数一下其中出现的所有“1”的个数。 例如:N = 2,写下1,2.这样只出现了1个“1”。 N = 12,我们会写下1,2,3,4,5,6,7,8,9,10,11,12.这样,1的个数是5. 参考资料:编程之美2.4 1的数目题目分析: 方法1:遍历从1原创 2014-11-05 15:00:09 · 450 阅读 · 0 评论 -
跳台阶问题 【微软面试100题 第二十七题】
题目要求: 一个台阶总共有n阶,如果一次可以跳1级,也可以跳2级。求总共有多少种跳法,并分析算法的时间复杂度。题目分析: f(n)=f(n-1)+f(n-2),f(1)=1,f(2)=2;--->f(3)=f(2)+f(1)=2+1;------>f(3)=Fibonacci(4)=Fibonacci(3)+Fibonacci(2) = 2+1;即问题转换为斐波那契数列原创 2014-11-05 14:43:41 · 347 阅读 · 0 评论 -
字符串中找出最长的数字串 【微软面试100题 第二十五题】
题目要求: 写一个函数,它的原型是int ContinueMax(char *outputStr,char *inputStr); 功能:在字符串中找出连续最长的数字串,并把这个串的长度返回,并把这个最长数字串赋给其中一个函数参数outputStr所指内存。 例如:"abcd12345ed125ss123456789"的首地址传给inputStr后,函数将返回9,ou原创 2014-11-05 14:40:13 · 387 阅读 · 0 评论 -
链表中倒数第k个结点 【微软面试100题 第十三题】
题目要求: 输入一个链表,输出该链表中倒数第k个结点。链表的倒数第0个结点为链表的尾指针。 参考资料:剑指offer第15题题目分析: 1.两个指针,第一个先走k步,然后两个指针同时走,直到第一个走到尾指针,此时第二个指针即为所求; 2.令函数原型为:ListNode *findKthToTail(ListNode *head,unsigned in原创 2014-11-05 14:17:19 · 350 阅读 · 0 评论 -
计算圆形是否和正方形相交 【微软面试100题 第二十三题】
题目要求: 用最简单、最快捷的方法计算出下面这个圆形是否和正方形相交。 3D坐标系原点(0.0,0.0,0.0);圆形:半径 r = 3.0,圆心 o = (*.*,0.0,*.*);正方形:4个角坐标 1:(*.*,0.0,*.*) 2:(*.*,0.0,*.*) 3:(*.*,0.0,*.*) 4:(*.*,0.0,*.*)题目分析: 用圆心到四条边的距离原创 2014-11-05 14:35:05 · 563 阅读 · 0 评论 -
字符串转换成整数 【微软面试100题 第二十题】
题目要求: 输入一个表示整数的字符串,把该字符串转换成整数并输出。 例如:输入字符串"235",输出整数235. 参考资料:剑指offer第49题、程序员编程艺术 (by July)题目分析: 1.基本思路:int StrToInt(char *str){ int num = 0; while(*str != '\0')原创 2014-11-05 14:29:22 · 451 阅读 · 0 评论 -
圆圈中最后剩下的数字 【微软面试100题 第十八题】
题目要求: 0,1,...,n-1这n个数排成一个圆圈,从数字0开始每次从这个圆圈里删除第m个数字。求出这个圆圈里剩下的最后一个数字。 例如,0、1、2、3、4这5个数字组成一个圆圈,从数字0开始每次删词第3个数字,则删除的前四个数字一次是2、0、4、1,因此最后剩下的数字是3. 参考资料:剑指offer第45题题目分析: 方法1:用环形链表模拟圆圈原创 2014-11-05 14:26:06 · 389 阅读 · 0 评论 -
第一个只出现一次的字符 【微软面试100题 第十七题】
题目要求: 在一个字符串中找到第一个只出现一次的字符,如输入abaccdeff,则输出b。 参考资料:剑指offer第35题题目分析: 采用hash表,建立一个256大小的hash空间。需要遍历两次字符串,第一次遍历用来更新hash表,第二次遍历找出第一个只出现一次的字符。原创 2014-11-05 14:26:17 · 371 阅读 · 0 评论 -
从上往下打印二叉树 【微软面试100题 第十六题】
题目要求: 从上往下打印出二叉树的每个结点,同一层的结点按照从左往右的顺序打印。 例如输入下图的二叉树,则依次打印出10,5,12,4,7 10 / \ 5 12 / \ 4 7 参考资料:剑指offer第23题、编程之美3.10题目分析: 使用一个辅助队列,队列中的每个元素都是一个指向结点的指针,用递归的方法把二叉树原创 2014-11-05 14:24:07 · 366 阅读 · 0 评论 -
复杂链表的复制 【微软面试100题 第七十六题】
题目要求: 一个复杂链表,其结点除了有一个m_pNext指针指向想一个结点外,还有一个m_pSibling指向链表中的任一结点或NULL,其结点的C++定义为: typedef struct ComplexNode{ int m_nValue; ComplexNode *m_pNext; ComplexNode *m_pSibling;}Complex原创 2014-11-23 14:20:32 · 457 阅读 · 0 评论 -
猜牌游戏 【微软面试100题 题二十二题】
题目要求: 有4张红色的牌和4张蓝色的牌,主持人先拿任意两张,再分别在A、B、C三人额头上帖任意两张牌,A、B、C三人都可以看见其余两人额头上的牌,看完后让他们猜自己额头上是什么颜色的牌,A说不知道,B说不知道,C说不知道,然后A说知道了。 请教如何推理,A是怎么知道的。如果用程序,又怎么实现呢?题目分析: 假设红用x表示,蓝用y表示,则可能有三种情况:原创 2014-11-05 14:33:49 · 515 阅读 · 0 评论 -
左旋转字符串 【微软面试100题 第二十六题】
题目要求: 定义字符串的左旋转操作:把字符串前面的若干个字符移动到字符串的尾部。 例如:把字符串abcdef左旋转2位得到字符串cdefab。请实现字符串左旋转函数。 参考资料:剑指offer第42题、编程珠玑第二章题目分析: 方法1 临时空间法:将前i个元素先复制到临时空间中,然后将余下的n-i个元素前移i个位置,最后再把临时空间中的元素放到余下的原创 2014-11-05 14:41:34 · 363 阅读 · 0 评论 -
【八十一题题目合集 微软面试100题 第八十一题】
题目要求: 问题1:在一个int数组里查找这样的数,它大于等于左侧所有数,小于等于右侧所有数。 问题2:一个文件,内含一千万行字符串,每个字符串在1k以内,要求找出所有相反的串对,如abc和cba。 问题3:STL的set用什么实现的?为什么不用hash?题目分析: 问题1分析: 假设int数组为data[]。 用两个数组原创 2014-11-24 18:42:28 · 500 阅读 · 0 评论 -
把数组排成最小的数 【微软面试100题 第六十八题】
题目要求: 输入一个正整数数组,将它们连接起来排成一个数,输出能排出的所有数字中最小的一个。 例如输入数组{32,321},则输出这两个能排成的最小数字32132. 请给出解决问题的算法,并证明该算法。 参考资料:剑指offer第33题。 链接:http://zhedahht.blog.163.com/blog/static/25411174200原创 2014-11-18 15:37:22 · 389 阅读 · 0 评论 -
括号问题 【微软面试100题 第四十六题】
题目要求: 四对括号可以有多少种匹配排列方式?比如两对括号可以有两种:()()和(())题目分析: 之前左括号的数量必须比右括号多,即卡特兰数, 令h(0)=1,h(1)=1,catalan数满足递推式, h(n)= h(0)*h(n-1)+h(1)*h(n-2) + ... + h(n-1)h(0) (n>=2), 例如:h(2)=h(0)*h(1)原创 2014-11-07 15:41:05 · 365 阅读 · 0 评论 -
矩阵运算 【微软面试100题 第四十五题】
题目要求: 对于一个整数矩阵,存在一种运算,对矩阵中任意元素加一时,需要其相邻(上下左右)某一个元素也加一,现给出以正数矩阵,判断其是否能够由一个全零矩阵经过上述运算得到。题目分析: 使用贪心算法。代码实现:发个原创 2014-11-07 15:35:57 · 439 阅读 · 0 评论 -
设计一个魔方(六面)的程序 【微软面试100题 第四十四题】
题目要求: 设计一个魔方(六面)的程序。题目分析: 把魔方从正面看展开成一个平面,如图1所示。设计一个类,其中Spacexy[SPACE][LEN][LEN];中的SPACE为0~5表示六个面,每个数字代表哪一面见图1.LEN为0~2,[LEN][LEN]表示某个面的3*3的9个格子。 类中的方法是根据展开的平面设计的,具体的某个面的某个格子由Spacexy[原创 2014-11-07 15:22:04 · 1594 阅读 · 0 评论 -
求一个有向连通图的割点 【微软面试100题 第三十九题】
题目要求: 求一个有向连通图的割点。割点的定义是,如果除去此结点和与其相关的边,有向图不再连通,描述算法。题目分析: 判断某个点是否是割点的方法是,删除该点和与其相关的边,然后求连通性;这样逐个删除点(每次有且只删除一个点),就可以判断该图的割点有哪些了。 判断图连通性的方法:从一个点出发,如果能遍历所有的点,则连通。 使用邻接表表示有向图:原创 2014-11-06 16:47:39 · 591 阅读 · 0 评论 -
第三十八题汇总 【微软面试100题 第三十八题】
第一题: 用天平(只能比较,不能称重)从一堆小球中找出其中唯一一个较轻的,用x次天平,最多可以从y个小球中找出较轻的那个,求y与x的关系式。分析: y = 3^x. 例如:Y= 9. 先分成3堆abc,每堆3个小球; 第一次称找出在abc中哪一堆:称a和b,如果天平不倾斜,则a和b一样重,较轻的一个球肯定在c堆中,否则就在a原创 2014-11-06 12:58:24 · 405 阅读 · 0 评论 -
链表和数组的区别在哪里 【微软面试100题 第七十八题】
题目要求: 链表和数组的区别在哪里?题目分析: 数组静态分配内存,链表动态分配内存; 数组预先定义长度,链表预先无需管理长度; 数组在内存中连续,链表可能连续; 数组元素在栈区,链表元素在堆区; 数组利用下标定位,时间复杂度为O(1),链表定位元素时间复杂度O(n); 数组插入或删除元素的时间复杂度O(n),链表的时间复杂度O(1)原创 2014-11-24 14:50:33 · 423 阅读 · 0 评论 -
排队问题 【微软面试100题 第八十题】
题目要求: 12个高矮不同的人,排成两排,每排必须是从矮到高排列,而且第二排比对应的第一排的人高,问排列的方式有多少种?问题分析:原创 2014-11-24 16:44:24 · 467 阅读 · 0 评论 -
合并链表 【微软面试100题 第四十二题】
题目要求: 两个非降序链表的并集,1->2->3和2->3->5合并为1->2->3->5. 另外只能输出结果,不能修改两个链表的数据。题目分析: 1.不能修改原链表数据:即,输出1->2->3->5后,原来的两个链表还是1->2->3和2->3->5。因此输出的这些结点都需要重新申请空间存放,不能使用原来的结点。 2.去掉相同值的结点。即,如果he原创 2014-11-06 18:56:00 · 481 阅读 · 0 评论 -
二叉搜索树的非递归前中后序遍历 【微软面试100题 第四十三题】
题目要求: 实现二叉搜索树的前序、中序、后序非递归遍历。题目分析: 非递归前序遍历:使用一个辅助栈,出栈一个结点并输出该结点,同时依次入栈该结点的右结点和左结点,再出栈,入栈...; 非递归中序遍历:使用一个辅助栈和一个临时结点,临时结点不断找树的左子树,知道为空,然后又跳到空结点父结点的右子树,又继续找右子树的左子树; 非递归后序遍历:使用两个辅助原创 2014-11-06 21:44:32 · 574 阅读 · 0 评论 -
珠子问题 【微软面试100题 第四十题】
题目要求: 一串首尾相连的珠子(m个),有N种颜色(N题目分析: 本题即为【最短摘要生成,见编程之美3.5】相关问题,见代码1. 因为本题为珠子首尾相连,和最短摘要有些许区别,可以参考代码1,只需要把退出while的条件改为pBegin又回到起点即可。 其中isAllExisted()函数可以用hash_map来实现,把N种颜色存到hash_m原创 2014-11-06 18:10:45 · 498 阅读 · 0 评论 -
关于链表问题的面试题目 【微软面试100题 第七十七题】
题目要求: 1.给定一个单链表,检测是否有环; 2.判断两个无环单链表是否有交点; 3.给定两个单链表,检测两个链表是否有交点; 4.给定单链表,如果有环的话请返回从头结点进入环的第一个结点; 5.只给定单链表中某个结点p(并非最后一个结点,即p->next!=NULL)指针,删除该结点; 6.只给定单链表中某个结点p(非空结点),在p前原创 2014-11-23 16:43:54 · 650 阅读 · 0 评论 -
二叉树两个结点的最低公共父结点 【微软面试100题 第七十五题】
题目要求: 输入二叉树中的两个结点,输出这两个及诶单在数中最低的共同父结点。题目分析: 还有一种情况:如果输入的两个结点中有一个或两个结点不在二叉树中,则输出没有共同父结点; 因此,可以在程序中定义一个flag=0,找到一个点之后flag就加1,最后判断的时候,如果flag=2,则说明在二叉树中找到了输入的两个结点。代码实现: #in原创 2014-11-23 13:40:15 · 353 阅读 · 0 评论 -
对称字符串的最大长度 【微软面试100题 第七十三题】
题目要求: 输入一个字符串,输出该字符串中对称的子字符串的最大长度。比如输入字符串"google",由于该字符串里最长的对称子字符串"goog",因此输出4.题目分析: 代码实现: #include int LongestPalindrome(const char *s, int n);int main(void ){ printf( "原创 2014-11-22 23:15:58 · 361 阅读 · 0 评论 -
数值的整数次方 【微软面试100题 第七十一题】
题目要求: 实现函数double Power(double base,int exponent),求base的exponent次方。 不得使用库函数,不需要考虑溢出。 参考资料:剑指offer第11题。题目分析: 考虑情况: 1.底数为0,指数为非负; 2.底数为0,指数为负; 3.底数非0,指数为负;原创 2014-11-22 22:44:07 · 423 阅读 · 0 评论 -
栈的push、pop序列 【微软面试100题 第二十九题】
题目要求: 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1、2、3、4、5是某栈的压栈序列,序列4、5、3、2、1是该压栈序列对应的一个弹出序列,单4、3、5、1、2就不可能是该压栈序列的弹出序列。 参考资料:剑指offer第22题。题目分析: 如果下一个弹出的数字刚好是栈顶数字,那原创 2014-11-05 14:57:13 · 532 阅读 · 0 评论 -
数组中超过出现次数一半的数字 【微软面试100题 第七十四题】
问题要求: 数组中有一个数字出现的次数超过了数组长度的一半,找出这个数字。 参考资料:编程之美2.3 寻找发帖水王问题分析: 方法1 对数组排序,然后顺次查找其中最多的; 方法2 对数组排序,最中间一个肯定为要找的数字,时间复杂度O(NlogN); 方法3 每次消去数组中两个不同的数,最后剩下的肯定为要找的数字,时间复杂度O(N).原创 2014-11-23 09:23:26 · 780 阅读 · 0 评论 -
整数的二进制表示中1的个数 【微软面试100题 第二十八题】
题目要求: 输入一个整数,求该整数的二进制表示中有多少个1. 例如输入10,由于其二进制表示作为1010,有两个1,因此输出2. 参考资料:剑指offer第10题、编程之美2.1题目分析: 方法1 除2取余法:一个数a%2的值为0或者1,根据是a的二进制表示的最低位为0,则前面结果为0;【取模和取余的效率比较低。】 方法2 位操作法:例如a原创 2014-11-05 14:45:50 · 947 阅读 · 0 评论 -
合并链表 【微软面试100题 第二十四题】
题目要求: 合并链表。已知链表h1和链表h2都是递增链表,要求合并后也是递增链表。 参考链接:http://blog.csdn.net/v_july_v/article/details/6870251 原链接代码while(h1 != NULL && h2 != NULL)应该修改为while(h1 != NULL || h2 != NULL)原创 2014-11-05 14:38:16 · 418 阅读 · 0 评论