微软四道经典算法面试题(附思路)

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

微软四道经典算法面试题(附思路)

1.比较经典的四个算法题,目前只收集到相关的思路和个别题目的解法,不断更新中

2. 1.一个整数数列,元素取值可能是0~65535中的任意一个数,相同数值不会重复出

现。0是例外,可以反复出现。

3.请设计一个算法,当你从该数列中随意选取5个数值,判断这5个数值是否连续相

邻。

4.注意:

5.- 5个数值允许是乱序的。比如: 8 7 5 0 6

6.- 0可以通配任意数值。比如:8 7 5 0 6 中的0可以通配成9或者4

7.- 0可以多次出现。

8.- 复杂度如果是O(n2)则不得分。

9. 2.设计一个算法,找出二叉树上任意两个结点的最近共同父结点。

10.复杂度如果是O(n2)则不得分。

11.3.一棵排序二叉树,令 f=(最大值最小值)/2,设计一个算法,找出距离f值最近、

大于f值的结点。

12.复杂度如果是O(n2)则不得分。

13.4.一个整数数列,元素取值可能是1~N(N是一个较大的正整数)中的任意一个数,

相同数值不会重复出现。设计一个算法,找出数列中符合条件的数对的个数,满足数对中两数的和等于N 1。

14.复杂度最好是O(n),如果是O(n2)则不得分。

15.思路分析

16.1.非0最大-非0最小 1 <=5 ==> 非0最大-非0最小 <=4

17.2.如果每个节点包含父亲指针,把两个节点到根的路径都记录下来,两条路径的最

后面的元素肯定相同,

18.从两条路径的最后一个元素向前比较,直到第一次出现分叉为止,就可以找到最近

节点。复杂度为O(n),

19.路径最长可能是n

20.如果不包含父亲节点,那就先前序遍历二叉树,遍历的时候可以像哈夫曼树那样左

右01编号,

21.记录给定两节点的到达路径,最后比较两个0,1序列的前面位数,直到出现不相等

为止,就找到最近父节点,

22.复杂度也是O(n)

23.3.找出最大值,最小值,复杂度都是O(h),然后搜索f,可以找到f应该插入的

位置,复杂度也是O(h),

24.再找f的后继,复杂度也是O(h),h最大可能是n,所以总体最坏情况复杂度就

是O(n)

25.4.先排序,复杂度O(nlgn),然后用两个指示器(front和back)分别指向第一

个和最后一个元素,如果

26.A[front] A[back]>N 1,则back–;

27.如果A[front] A[back]=N 1,则计数器加1,back–,同时front ;

28.如果A[front] A[back] 重复上述步骤,O(n)时间找到所有数对,总体复杂度

为O(nlgn)

29.题目分析

30.第1题:首先扫描一遍求出非0平均值,然后再扫描一遍即可判断,复杂度:O(n)

31.第2题,是一个送分题,可以设计一个相当巧妙的数据结构,其复杂度为O(n)

32.第3题,也是送分题,扫描几次即可

33.第4题,送分题。牺牲空间即可完成。

34.具体算法

35.1.思路是非0最大值-非0最小值 <=数组长度-1

36.我觉得这道题的前提非常重要

37.p ublic boolean isContiguous(int[] array)

38. {

39. int min=-1;

40. int max=-1;

41. for(int i=0;i

42. {

43. if(array!=0)

44. {

45. if(min==-1||min>array)

46. {

47. min=array;

48. }

49. if(max==-1||max

50. {

51. max=array;

52. }

53. }

54. }

55. return max-min <=array.length-1;

56. }

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

58. public static int getSumCount(int[] array,int N)

59. {

60. int count=0;

61. //创建哈希表

62. int[] hashTable=new int[N 1];

63. for(int i=0;i

64. {

65. hashTable[array]=array;

66. }

67. for(int i=0;i

68. {

69. //如果是数对中较小的整数(防止重复计数)

70. //并且配对的整数存在

71. //并且不等于与之配对的整数,因数列不存在重复整数

72. if(array <=(N 1)/2&&hashTable[N 1-array]!=0&&arra

y*2!=N 1)

73. {

74. count ;

75. }

76. }

77. return count;

78. }

相关文档
最新文档