微软一百题强化训练
文章平均质量分 50
GeekLiudream
成为一个快乐的IT男,门外汉+菜鸟的提升之路
展开
-
微软100题(48)循环数组的查找
题目:一个数组是由一个递减数列左移若干位形成的,比如{4,3,2,1,6,5}是由{6,5,4,3,2,1}左移两位形成的,在这种数组中查找某一个数。思路:对于排序数组查找,最快用二分查找,但是此数组已经移动了一些位数 以中间为划分,需要判断左边是单调递减的还是右边是单调递减int FindNumInLeftShiftArray(vector &原创 2015-06-01 11:24:12 · 410 阅读 · 0 评论 -
微软100题(70)字符串的全排列
给出一个函数来输出一个字符串的所有排列思路:递归确定一位后,不断和后面的交换void Permutation(char* element,int start,int end){ if(start==end) { for (int i=0;i<=end;++i) cout<<*(element+i); cout<<endl; } else { for (原创 2015-06-10 10:40:26 · 389 阅读 · 0 评论 -
微软100题(71)数值的整数次方
数值的整数次方(数字、运算)。题目:实现函数double Power(double base, int exponent),求base的exponent次方。不需要考虑溢出。原创 2015-06-10 14:57:36 · 411 阅读 · 0 评论 -
微软100题(67)判断扑克牌顺子否和掷骰子
1.扑克牌的顺子从扑克牌中随机抽5张牌,判断是不是一个顺子,即这5张牌是不是连续的。2-10为数字本身,A为1,J为11,Q为12,K为13,而大小王可以看成任意数字。2.n个骰子的点数。把n个骰子扔在地上,所有骰子朝上一面的点数之和为S。输入n,打印出S的所有可能的值出现的概率。1:原创 2015-06-03 14:56:59 · 958 阅读 · 0 评论 -
微软100题(69)旋转数组中的最小元素(数组、算法)
旋转数组中的最小元素(数组、算法)。题目:把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个排好序的数组的一个旋转,输出旋转数组的最小元素。例如数组{3, 4, 5, 1, 2}为{1, 2, 3, 4, 5}的一个旋转,该数组的最小值为1。思路:数组被分成两段有序的,找到分界线就好,可以用二分法找分界线int FindMinInOrder(int*原创 2015-06-10 10:15:34 · 626 阅读 · 0 评论 -
微软100题(72)单例模式
题目:设计一个类,我们只能生成该类的一个实例。分析:只能生成一个实例的类是实现了Singleton模式的类型。单例模式[cpp] view plaincopyclass Singleton { private: Singleton(){}; static Singleton*原创 2015-06-10 15:16:08 · 428 阅读 · 0 评论 -
微软100题(73)对称字符串的最大长度
对称字符串的最大长度(字符串)。题目:输入一个字符串,输出该字符串中对称的子字符串的最大长度。比如输入字符串“google”,由于该字符串里最长的对称子字符串是“goog”,因此输出4。思路:将题目转化为,求原串和反转串的最长连续子串的长度int LongCommonSubstr(string s1, string s2){ int m = s1.length();原创 2015-06-10 15:17:46 · 521 阅读 · 0 评论 -
微软100题(78)链表和数组的区别
链表和数组的区别在哪里(链表、数组)?分析:主要在基本概念上的理解。二者都属于一种数据结构从逻辑结构来看1. 数组必须事先定义固定的长度(元素个数),不能适应数据动态地增减的情况。当数据增加时,可能超出原先定义的元素个数;当数据减少时,造成内存浪费;数组可以根据下标直接存取。2. 链表动态地进行存储分配,可以适应数据动态地增减的情况,且可以方便地插入原创 2015-06-11 10:37:07 · 305 阅读 · 0 评论 -
微软100题(12) 求1+2+3+...+n,不用减乘除
题目:求1+2+…+n, 要求不能使用乘除法、for、while、if、else、switch、case等关键字以及条件判断语句(A?B:C)。思路:不能用基本的数学,那么想,怎么能达到n呢,如何重复执行n次,联想到一个类对象构造时候调用构造函数,那么一个长度为n的类对象数组,构造时候,构造函数就要执行n次。class Element{public: Element(原创 2015-05-25 09:42:16 · 477 阅读 · 0 评论 -
微软100题(17)字符串中只出现一次的字母
题目:在一个字符串中找到第一个只出现一次的字符。如输入abaccdeff,则输出b。思路:字符串题目一般可以考虑的方法之一便是hashtable,因为一共就那么256个字符,有时候如果题目确定只有26个字母,那么甚至只需要一个26长度的hash数组char FindTheFirstOne(char* string){ if(string==NULL) return '\0';原创 2015-05-25 14:43:13 · 382 阅读 · 0 评论 -
微软100题(24)链表就地转置
题目:单链表就地转置常规题目ListNode* ReverseList(ListNode* pHead){ ListNode* pReverseHead = NULL; ListNode* pNode = pHead; ListNode* pPre = NULL; while (pNode!=NULL) { ListNode* pNext = pNode->m_原创 2015-05-25 21:13:46 · 411 阅读 · 0 评论 -
微软100题(23)判断正方形和圆形相交
题目:用最简单,最快速的方法计算出下面这个圆形是否和正方形相交。" 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, *.*)原创 2015-05-25 20:57:48 · 1095 阅读 · 0 评论 -
微软100题(18)约瑟夫环
题目:n个数字(0,1,…,n-1)形成一个圆圈,从数字0开始, 每次从这个圆圈中删除第m个数字(第一个为当前数字本身,第二个为当前数字的下一个数字)。 当一个数字删除后,从被删除数字的下一个继续删除第m个数字。 求出在这个圆圈中剩下的最后一个数字。int LastRemainInCircle(unsigned int n,unsigned int m){ if(n < 1 || m <原创 2015-05-25 14:46:56 · 396 阅读 · 0 评论 -
微软100题(59)不能被继承的类
题目:用C++设计一个不能被继承的类。思路:什么类不能被继承呢,继承时候要子类对象要调用父类的构造函数初始化子类对象中属于父类的部分,如果父类的构造是私有的了,那么子类就无法访问,那么就不能继承了class NosealClass { public: static NosealClass* GetInstance() {原创 2015-06-02 21:29:03 · 354 阅读 · 0 评论 -
微软100题(63)在字符串中删除特定的字符
在字符串中删除特定的字符(字符串)。题目:输入两个字符串,从第一字符串中删除第二个字符串中所有的字符。例如,输入”They are students.”和”aeiou”,则删除之后的第一个字符串变成”Thy r stdnts.”。思路:字符串一般可以用hash[256]void DeleteCharInStr(char* src,char* des)原创 2015-06-02 22:37:59 · 420 阅读 · 0 评论 -
微软100题(65)输出1到最大的N位数(运算)
输出1到最大的N位数(运算)题目:输入数字n,按顺序输出从1最大的n位10进制数。比如输入3,则输出1、2、3一直到最大的3位数即999。思路:当N较大时候,就已经溢出了,所以这是个大数问题,可以参见http://blog.csdn.net/liuqing0517/article/details/46008697每次加一输出加法程序:stri原创 2015-06-03 11:47:39 · 393 阅读 · 0 评论 -
微软100题(64)寻找第1500个丑数
题目:我们把只包含因子2、3和5的数称作丑数(Ugly Number)。例如6、8都是丑数,但14不是,因为它包含因子7。习惯上我们把1当做是第一个丑数。求按从小到大的顺序的第1500个丑数。思路:最直观的方法,逐一判断是不是丑数,知道找到1500个丑数bool isUgly(int number){ while (number%2==0) number =原创 2015-06-03 11:38:16 · 1222 阅读 · 0 评论 -
微软100题(66)用递归颠倒栈
题目:用递归颠倒一个栈。例如输入栈{1, 2, 3, 4, 5},1在栈顶。颠倒之后的栈为{5, 4, 3, 2, 1},5处在栈顶。思路:栈为空就终止,否则出栈,递归处理,然后进栈,这里需要用两个递归,一个用于出来,一个用于进栈底 void AddToBottom(stack &data,int element){ if(data.empty()) data.pu原创 2015-06-03 12:10:29 · 662 阅读 · 0 评论 -
微软100题(9) 二叉搜索树的后序遍历
题目:判断整数序列是不是二元查找树的后序遍历结果题目:输入一个整数数组,判断该数组是不是某二元查找树的后序遍历的结果。如果是返回true,否则返回false。例如输入5、7、6、9、11、10、8,由于这一整数序列是如下树的后序遍历结果: 8 / / 6 10 / / / / 5 7 9原创 2015-05-23 21:11:23 · 347 阅读 · 0 评论 -
微软100题(4) 在二元树中找出和为某一值的所有路径
题目:输入一个整数和一棵二元树。从树的根结点开始往下访问一直到叶结点所经过的所有结点形成一条路径。打印出和与输入整数相等的所有路径。例如 输入整数22和如下二元树 10 / / 5 12 / \ 4 7则打印出两条路径:10, 12和10, 5, 7。二元树节点的数据结构定义为:struct Bina原创 2015-05-19 20:44:47 · 411 阅读 · 0 评论 -
微软100题(10) 翻转句子
题目:翻转句子中单词的顺序。题目:输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变。句子中单词以空格符隔开。为简单起见,标点符号和普通字母一样处理。例如输入“I am a student.”,则输出“student. a am I”。先考虑如果没有空格时候,如果反转一个单词,直接从后往前交换即可void Reverse(char* pBegin,c原创 2015-05-24 10:49:55 · 342 阅读 · 0 评论 -
微软100题(11) 二叉树中节点的最大距离
题目:求二叉树中节点的最大距离...如果我们把二叉树看成一个图,父子节点之间的连线看成是双向的,我们姑且定义"距离"为两节点之间边的个数。写一个程序,求一棵二叉树中相距最远的两个节点之间的距离我觉得相隔最远的 应该是左子树最深的 和 右子树最深的结点之间所以转变为求左子树深度 和 右子树深度 最长距离为左右子树深度之和int TreeDepth(Bina原创 2015-05-24 16:36:51 · 513 阅读 · 1 评论 -
微软100题(68)把数组排成最小的数
题目:输入一个正整数数组,将它们连接起来排成一个数,输出能排出的所有数字中最小的一个。例如输入数组{32, 321},则输出这两个能排成的最小数字32132。请给出解决问题的算法,并证明该算法。思路:参见《剑指offer》,需要定义一种判断两个串大小的比较方式 "123""32" 和 "32""123" 前者小于后者,对应"123" ch原创 2015-06-10 09:48:34 · 494 阅读 · 0 评论 -
微软100题(19)Fibonacci数列
题目:定义Fibonacci数列如下: / 0 n=0 f(n)= 1 n=1 / f(n-1)+f(n-2) n=2输入n,用最快的方法求该数列的第n项。递归貌似很容易栈溢出,所以是个不算好的方原创 2015-05-25 15:32:25 · 424 阅读 · 0 评论 -
微软100题(20)字符串到整数的转化
题目:输入一个表示整数的字符串,把该字符串转换成整数并输出。例如输入字符串"345",则输出整数345多考虑一些情况,如 345,前面有空格的, -345 +345前面有符号的,3#45,中间有非法字符的等等bool valid = true;#define INT_MAX ((int)0x7FFFFFFF)#define INT_MIN ((int)0x80000原创 2015-05-25 16:04:54 · 333 阅读 · 0 评论 -
微软100题(5) 查找最小的k个元素
题目:输入n个整数,输出其中最小的k个。例如输入1,2,3,4,5,6,7和8这8个数字,则最小的4个数字为1,2,3和4。方法一:如果可以修改原来数组的元素,则利用快排的partition算法,可以把较小的k个元素,划分到前面去int Partition(vector &data,int start, int end){ int i=start,j=end; while (i<原创 2015-05-19 21:48:24 · 698 阅读 · 0 评论 -
微软100题(21)1到n找出所有的和为m的组合
编程求解:输入两个整数 n 和 m,从数列1,2,3.......n 中 随意取几个数,使其和等于 m ,要求将其中所有的可能组合列出来.思路:n肯定小于等于m,大的话也没有; 对于n,如果在组合里面,那就在n-1里面找和为m-n的;不在组合里面,那就在n-1里面找和为m的,void FindComb(int n,int m,int *flag,int length)原创 2015-05-25 16:58:07 · 1148 阅读 · 0 评论 -
微软100题(25)找出字符串中的最长数字串
题目:找出字符串中的最长数字串如,给一个字符串abcd1223chd12345,返回最长数字串的长度,并用outputstr保存该最长数字串int continumax(char *outputstr,char *inputstr){ int max = 0; *outputstr = '\0'; if(inputstr==NULL) return 0; char* s原创 2015-05-26 08:59:25 · 365 阅读 · 0 评论 -
微软100题(83)百度面试题_memmove实现
第3组百度面试题1.今年百度的一道题目百度笔试:给定一个存放整数的数组,重新排列数组使得数组左边为奇数,右边为偶数。要求:空间复杂度O(1),时间复杂度为O(n)。2.百度笔试题用C语言实现函数void * memmove(void *dest, const void *src, size_t n)。memmove函数的功能是拷贝src所指的内存内容前n个字节到dest所指原创 2015-06-15 15:37:09 · 669 阅读 · 0 评论 -
微软100题(80)高矮排序的排列方式
问题描述:12个高矮不同的人,排成两排,每排必须是从矮到高排列,而且第二排比对应的第一排的人高,问排列方式有多少种?思路:又是一道卡特兰数的题目参见http://blog.csdn.net/hackbuteer1/article/details/7450250程序和括号匹配的题目很像12个人按照高矮序号1 2 3 4 5 6 7 8 9 10 11 120代原创 2015-06-15 10:21:22 · 1126 阅读 · 0 评论 -
微软100题(54)调整数组顺序使奇数位于偶数前面
题目:输入一个整数数组,调整数组中数字的顺序,使得所有奇数位于数组的前半部分,所有偶数位于数组的后半部分。要求时间复杂度为O(n)。思路:一前一后指针,和快排的划分思路一样,遇到满足条件的交换void RecordAdjust(int data[],int n){ if(data==NULL||n<=0) return ; int *pbegin = data; int原创 2015-06-02 10:25:18 · 389 阅读 · 0 评论 -
微软100题(86)有序数组到二叉树
怎样编写一个程序,把一个有序整数数组放到二叉树中思路:肯定不能偏向一侧,所以根节点应该为最中间的那个元素之后再递归处理Node * array2Tree(int[] array) { return helper(array, 0, n-1);}Node * helper(int[] array, int start, int end) { if (start >原创 2015-06-15 22:24:06 · 455 阅读 · 0 评论 -
微软100题(79)strstr函数的实现
1.编写实现链表排序的一种算法。说明为什么你会选择用这样的方法?2.编写实现数组排序的一种算法。说明为什么你会选择用这样的方法?3.请编写能直接实现strstr()函数功能的代码。1.解答:原创 2015-06-11 10:43:16 · 738 阅读 · 0 评论 -
微软100题(81)百度面试题_大数据处理
第1组百度面试题1.一个int数组,里面数据无任何限制,要求求出所有这样的数a[i],其左边的数都小于等于它,右边的数都大于等于它。能否只用一个额外数组和少量其它空间实现。2.一个文件,内含一千万行字符串,每个字符串在1K以内,要求找出所有相反的串对,如abc和cba。3.STL的set用什么实现的?为什么不用hash?1解答:原创 2015-06-15 11:25:00 · 931 阅读 · 0 评论 -
微软100题(82)百度面试题_url访问频度排序
第2组百度面试题1.给出两个集合A和B,其中集合A={name},集合B={age、sex、scholarship、address、...},要求:问题1、根据集合A中的name查询出集合B中对应的属性信息;问题2、根据集合B中的属性信息(单个属性,如age2.给出一个文件,里面包含两个字段{url、size},即url为网址,size为对应网址访问的次数,要求:原创 2015-06-15 14:56:20 · 687 阅读 · 0 评论 -
微软100题(84)百度面试题_随机发生器
第4组百度面试题2010年3道百度面试题[相信,你懂其中的含金量]1.a~z包括大小写与0~9组成的N个数用最快的方式把其中重复的元素挑出来。2.已知一随机发生器,产生0的概率是p,产生1的概率是1-p,现在要你构造一个发生器,使得它构造0和1的概率均为1/2;构造一个发生器,使得它构造1、2、3的概率均为1/3;...,构造一个发生器,使得它构造1、2、3、...n的概率原创 2015-06-15 15:39:44 · 628 阅读 · 0 评论 -
微软100题(22)ABC三人纸牌的推理
题目:有4张红色的牌和4张蓝色的牌,主持人先拿任意两张,再分别在A、B、C三人额头上贴任意两张牌,A、B、C三人都可以看见其余两人额头上的牌,看完后让他们猜自己额头上是什么颜色的牌,A说不知道,B说不知道,C说不知道,然后A说知道了。请教如何推理,A是怎么知道的。推理:A B C都说不知道,那么不存在两个人的和为全红 或者 全蓝,至少有一个人士 红 蓝 组合原创 2015-05-25 19:21:26 · 1911 阅读 · 0 评论 -
微软100题(77)链表的题目
.关于链表问题的面试题目如下(链表):1.给定单链表,检测是否有环。 使用两个指针p1,p2从链表头开始遍历,p1每次前进一步,p2每次前进两步。如果p2到达链表尾部,说明无环,否则p1、p2必然会在某个时刻相遇(p1==p2),从而检测到链表中有环。 2.给定两个单链表(head1, head2),检测两个链表是否有交点,如果有返回第一个交点。 如果head原创 2015-06-11 10:35:24 · 528 阅读 · 0 评论 -
微软100题(13)求链表倒数第K个结点
第13题(链表):题目:输入一个单向链表,输出该链表中倒数第k个结点。链表的倒数第0个结点为链表的尾指针。链表结点定义如下: struct ListNode{ int m_nKey; ListNode* m_pNext;};思路一:第一遍找到总长n,算出倒数第k个事哪个,n-k+1个节点思路二:快慢指针,快的先走k-1步,然后开始一起走,快的到原创 2015-05-25 10:23:41 · 402 阅读 · 0 评论 -
微软100题(16)二叉树的层序遍历
题目(微软): 输入一颗二元树,从上往下按层打印树的每个结点,同一层中按照从左往右的顺序打印。 例如输入 8 / \ 6 10 / \ / \ 5 7 9 11 输出8 6 10 5 7 9 11。二叉树的层序遍历void BinaryTreeBFS(BinaryTreeNode* proot){原创 2015-05-25 14:19:00 · 397 阅读 · 0 评论