专栏名称: Python技术博文
分享有关Python知识,了解IT界最新技术,让我们一起从菜鸟变成大牛吧!
目录
相关文章推荐
51好读  ›  专栏  ›  Python技术博文

近几年微软笔试题汇总分类解析

Python技术博文  · 公众号  · Python  · 2017-06-15 09:17

正文

请到「今天看啥」查看全文


4 -2 -5} ,第一个包含 [n/2] 个点的最小区间就是 [-5,-2] 。( 2011 4 月实习招聘考题)

分析:这道题目让求解的是前n/2 个数,也就是说,我们找到中位数和最大 ( ) 元素即可。而求中位数的方法,在数组有序的时候显然是二分,但这里的数组是无序的,恩,要时刻记得快排的 partition 算法,在很多时候很有帮助。代码如下:


[cpp] view plain copy

  1. int Partition( int * A, int begin, int end)

  2. {

  3. //分治元素

  4. int X = A[end];

  5. //A[begin]...A[i-1]

  6. int i=begin;

  7. //A[j]...A[end]>=X

  8. int j=end;

  9. //循环开始前A[j]是等待被填充的元素,该元素已被保存到X

  10. while (i

  11. {

  12. //从前面开始找到小于X的数

  13. while (A[i]

  14. i++;

  15. //A[j]被填充,A[i]等待被填充

  16. if (i

  17. A[j] = A[i];

  18. while (A[j]>=X && i

  19. j--;

  20. //A[i]被填充,A[j]等待被填充

  21. if (i

  22. A[i]=A[j];

  23. }

  24. A[i] = X;

  25. return i;

  26. }

  27. /*

  28. 返回中位数元素

  29. @para:

  30. A[begin...end]为所求数组

  31. middle_index 为中位数的索引

  32. middle_element为中位数元素,返回用

  33. */

  34. void FindMiddleElement( int * A, int begin , int end,

  35. int middle_index, int & middle_element)

  36. {

  37. if (!A || begin>end)

  38. {

  39. return ;

  40. }

  41. int split_pos = Partition(A,begin,end);

  42. if (split_pos == middle_index)

  43. {

  44. middle_element = A[split_pos];

  45. return ;

  46. }

  47. FindMiddleElement(A,begin,split_pos-1,middle_index,middle_element);

  48. FindMiddleElement(A,split_pos+1,end,middle_index,middle_element);

  49. }



8、 N 个数,范围从 -N N, 可能重复,排序时间复杂度最好能到多少? 2011 9 月招聘考题)

分析:答案是O(n) ,使用 计数排序和位图排序,桶排序都可以达到这个时间复杂度。



9 假设一个 长度为 80 的数组 选择排序已完成主循环 32 次迭代。现在 能保证有多少元素 是在他们 最终的位置 2012 4 月实习生招聘考题)

A 16    B 31 C 32 D 39   E 40

分析:这个不用过多解释吧,对选择排序不了解的详见找工作知识储备 (3)--- 从头说 12 种排序算法:原理、图解、动画视频演示、代码以及笔试面试题目中的应用


10 、下列哪项陈述是对的? 2012 4 月实习招聘考题)

A 、我们能从一颗二叉树的先序遍历序列和中序遍历序列,确定这颗二叉树。

B 、我们能从一颗二叉树的先序遍历序列和后序遍历序列,确定这颗二叉树。

C 、近乎排序的数组,插入排序可以比快排更有效。

D 、假设 T(n) 是解决 n 个元素的问题时候的运行时间, T(N)= O(1) 如果 n = 1 T(n) 2×T(N/2)+ O(n) n 1 ;则 T(n) O(nlgn)

E 、上述都不对


11 、下面哪项 ( ) 陈述是对的? 2012 4 月实习招聘考题)

A 、插入排序和冒泡排序 大型数据集 下效率很低

B 、快速排序是在最坏情况 比较 O N^2

C 、有一 序列 7,6,5,4,3,2,1 。如果使用选择排序(升序),交换操作 数是 6

D 、堆排序使用两个堆操作:插入、堆调整

E 上述都不对

分析:常规题,对各种排序算法要熟悉


12 最长递增子序列( LIS )是一个序列 满足 元素的值不断增加 的子序列中最长的序列

例如,里 { 2,1,4,2,3,7,4,6 } { 1,2,3,4,6 } ,以及 LIS 的长度为 5

考虑具有 n 个元素的数组, 则得到 LIS 的长度 最低的时间复杂度和空间复杂度 是多少 ?( 2012 4 月实习招聘考题)

A Time : N^2 , Space : N^2
B Time : N^2 , Space : N
C Time : NlogN , Space : N
D Time : N , Space : N
E Time : N , Space : C

分析:详见找工作知识储备 (2)--- 数组字符串那些经典算法:最大子序列和,最长递增子序列,最长公共子串,最长公共子序列,字符串编辑距离,最长不重复子串,最长回文子串


13 、对于以下的定义 201 3 4 月实习招聘考题)


[cpp] view plain copy

  1. int [][] myArray3 = new int [3][]{

  2. new int [3]{5,6,2},

  3. new int [5]{6,9,7,8,3},

  4. new int [2]{3,2}};


myArray3[2][2] 返回的是 ?

A. 9

B. 2

C. 6

D. overflow

分析:越界导致overflow


14 、以下哪些 排序方法是稳定的? 201 3 4 月实习招聘考题)

A. 冒泡排序

B. 快速排序

C. 堆排序

D. 归并排序

E. 选择排序


15 快速排序的最好时间复杂度是 ? 2013 9 月招聘考题)

A O(lgn)
B O(n)
C O(nlgn)
D O(n*n)

分析:好吧,这一题就不解释了,大家都知道的。



2 、链表相关

1 、下列程序的输出是什么? 2012 4 月实习招聘考题)


[cpp] view plain copy

  1. #include

  2. using namespace std;

  3. struct Item

  4. {

  5. char







请到「今天看啥」查看全文