四道微软面试经典算法题

简介:
比较经典的四个算法题,目前只收集到相关的思路和个别题目的解法,不断更新中 
1.一个整数数列,元素取值可能是0~65535中的任意一个数,相同数值不会重复出现。0是例外,可以反复出现。 
请设计一个算法,当你从该数列中随意选取5个数值,判断这5个数值是否连续相邻。 
注意: 
- 5个数值允许是乱序的。比如: 8 7 5 0 6 
- 0可以通配任意数值。比如:8 7 5 0 6 中的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)则不得分。 
思路分析 
1.非0最大-非0最小+1 <=5 ==> 非0最大-非0最小 <=4 
2.如果每个节点包含父亲指针,把两个节点到根的路径都记录下来,两条路径的最后面的元素肯定相同, 
从两条路径的最后一个元素向前比较,直到第一次出现分叉为止,就可以找到最近节点。复杂度为O(n), 
路径最长可能是n 
如果不包含父亲节点,那就先前序遍历二叉树,遍历的时候可以像哈夫曼树那样左右01编号, 
记录给定两节点的到达路径,最后比较两个0,1序列的前面位数,直到出现不相等为止,就找到最近父节点, 
复杂度也是O(n) 
3.找出最大值,最小值,复杂度都是O(h),然后搜索f,可以找到f应该插入的位置,复杂度也是O(h), 
再找f的后继,复杂度也是O(h),h最大可能是n,所以总体最坏情况复杂度就是O(n) 
4.先排序,复杂度O(nlgn),然后用两个指示器(front和back)分别指向第一个和最后一个元素,如果 
A[front]+A[back]>N+1,则back–; 
如果A[front]+A[back]=N+1,则计数器加1,back–,同时front++; 
如果A[front]+A[back] 重复上述步骤,O(n)时间找到所有数对,总体复杂度为O(nlgn) 
题目分析 
第1题:首先扫描一遍求出非0平均值,然后再扫描一遍即可判断,复杂度:O(n) 
第2题,是一个送分题,可以设计一个相当巧妙的数据结构,其复杂度为O(n) 
第3题,也是送分题,扫描几次即可 
第4题,送分题。牺牲空间即可完成。 
具体算法 
1.思路是 非0最大值-非0最小值 <=数组长度-1 
我觉得这道题的前提非常重要 

1public boolean isContiguous(int[] array) 
2   { 
3   int min=-1; 
4   int max=-1; 
5   for(int i=0;i <array.length;i++) 
6   { 
7   if(array[i]!=0) 
8   { 
9   if(min==-1||min>array[i]) 
10   { 
11   min=array[i]; 
12   } 
13   if(max==-1||max <array[i]) 
14   { 
15   max=array[i]; 
16 } 
17   } 
18   } 
19   return max-min <=array.length-1; 
20   } 

4.关键点在于创建一个Hash表,典型的以空间换时间:-) 

1    public static int getSumCount(int[] array,int N) 
2     { 
3     int count=0; 
4     //创建哈希表 
5         int[] hashTable=new int[N+1]; 
6         for(int i=0;i <array.length;i++) 
7         { 
8         hashTable[array[i]]=array[i]; 
9         } 
10         for(int i=0;i <array.length;i++) 
11         { 
12         //如果是数对中较小的整数(防止重复计数) 
13         //并且配对的整数存在 
14                 //并且不等于与之配对的整数,因数列不存在重复整数 
15                 if(array[i] <=(N+1)/2&&hashTable[N+1-array[i]]!=0&&array[i]*2!=N+1) 
16         { 
17             count++; 
18         } 
19         } 
20     return count; 
21     }


本文转自左正博客园博客,原文链接:http://www.cnblogs.com/soundcode/archive/2011/11/21/2257605.html,如需转载请自行联系原作者
目录
相关文章
|
1月前
|
开发框架 算法 搜索推荐
C# .NET面试系列九:常见的算法
#### 1. 求质数 ```c# // 判断一个数是否为质数的方法 public static bool IsPrime(int number) { if (number < 2) { return false; } for (int i = 2; i <= Math.Sqrt(number); i++) { if (number % i == 0) { return false; } } return true; } class Progr
58 1
|
10天前
|
负载均衡 算法 应用服务中间件
面试题:Nginx有哪些负载均衡算法?Nginx位于七层网络结构中的哪一层?
字节跳动面试题:Nginx有哪些负载均衡算法?Nginx位于七层网络结构中的哪一层?
28 0
|
3月前
|
算法 前端开发 JavaScript
【面试题】 面试官:你都工作3年了,这个算法题都不会?
【面试题】 面试官:你都工作3年了,这个算法题都不会?
|
27天前
|
算法
覃超老师 算法面试通关40讲
无论是阿里巴巴、腾讯、百度这些国内一线互联网企业,还是 Google、Facebook、Airbnb 等硅谷知名互联网公司,在招聘工程师的过程中,对算法和数据结构能力的考察都是重中之重。本课程以帮助求职者在短时间内掌握面试中最常见的算法与数据结构相关知识点,学会面试中高频算法题目的分析思路,同时给大家从面试官的角度来分析算法题的解答技巧,从而更有效地提升求职者的面试通过率。
15 3
覃超老师 算法面试通关40讲
|
1月前
|
存储 算法
【数据结构与算法】【腾讯阿里链表面试题】算法题--链表易懂版讲解
【数据结构与算法】【腾讯阿里链表面试题】算法题--链表易懂版讲解
|
3月前
|
算法 搜索推荐 Java
数据结构与算法面试:基于比较的排序算法时间复杂度最坏情况下是 O(nlogn),请问有没有更快的算法?(提示:计数排序、基数排序)
数据结构与算法面试:基于比较的排序算法时间复杂度最坏情况下是 O(nlogn),请问有没有更快的算法?(提示:计数排序、基数排序)
21 0
|
3月前
|
机器学习/深度学习 存储 算法
数据结构与算法面试题:给定非负整数 m 和 n,计算不大于 m 的数字中,素数的个数。(提示:算法原理为埃氏筛、线性筛)
数据结构与算法面试题:给定非负整数 m 和 n,计算不大于 m 的数字中,素数的个数。(提示:算法原理为埃氏筛、线性筛)
34 0
|
3月前
|
前端开发 算法 搜索推荐
【面试题】20个常见的前端算法题,你全都会吗?
【面试题】20个常见的前端算法题,你全都会吗?
|
3月前
|
算法 前端开发 JavaScript
【面试高频题】难度 2/5,回溯算法经典运用
【面试高频题】难度 2/5,回溯算法经典运用
|
3月前
|
缓存 移动开发 前端开发
来自大厂 300+ 前端面试题大全附答案(整理版)+前端常见算法面试题~~最全面详细
来自大厂 300+ 前端面试题大全附答案(整理版)+前端常见算法面试题~~最全面详细
173 0