四道微软面试算法题 [个人解法]

来源:互联网 发布:浮生知星辰在线阅读 编辑:程序博客网 时间:2024/04/27 22:13
  1. /****************************************************************************
  2. 题目要求 :一个整数数列,元素取值可能是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. 用C描述的算法
  10. 功能 :判断随意取的数值是否连续相邻,相邻返回1,否则返回0 
  11. 参数array :存储随意取的数
  12. 参数size :随意取的数的个数 
  13. ****************************************************************************/
  14. int is_progression(array, size)
  15. {
  16.     /*最大值的索引和最小值的索引*/
  17.     maxIndex = 0; 
  18.     minIndex = 0; 
  19.     i = 0;
  20.     /*试图找到第一个不为0的元素,初始化maxIndex和minIndex*/
  21.     for ( ; i < size; ++i )
  22.     {
  23.         if ( array[i] != 0 )
  24.         {
  25.             maxIndex = minIndex = i;
  26.             break;
  27.         }
  28.     }
  29.     /*试图确定随意取的数中的最大值和最小值*/
  30.     for ( ; i < size; ++i )
  31.     {
  32.         if ( array[i] > array[maxIndex] )
  33.         {
  34.             maxIndex = i;
  35.         }
  36.         else if ( array[i] < array[minIndex] )
  37.         {
  38.             minIndex = i;
  39.         }
  40.     }
  41.     /*如果最大值和最小值的差小于总个数,则可以判定它们是连续相邻的*/
  42.     return (array[maxIndex] - array[minIndex]) < size ? 1 : 0;
  43. /****************************************************************************
  44. 题目要求 :设计一个算法,找出二叉树上任意两个结点的最近共同父结点。 
  45. 复杂度如果是O(n2)则不得分。 
  46. 用C描述的算法,注释略
  47. ****************************************************************************/
  48. typedef int datatype
  49. typedef struct tree_node{
  50.     datatype data;
  51.     struct tree_node *lchild;
  52.     struct teee_node *rchild;
  53. }treenode, *lptreenode;
  54. treenode* find_parentnode(tree, node1, node2)
  55. {
  56.     initstack(s);
  57.     push(s, tree);
  58.     finded = 0;
  59.     parentnode = tree;
  60.     while ( !stackempty(s) )
  61.     {
  62.         while ( gettop(s, p) && p )
  63.         {
  64.             if ( p == node1 )
  65.             {
  66.                 finded += 1;
  67.             }
  68.             if ( p == node2 )
  69.             {
  70.                 finded += 1;
  71.             }
  72.             if ( finded == 0 )
  73.             {
  74.                 parentnode = p;
  75.                 break;
  76.             }
  77.             else if ( finded == 2 )
  78.             {
  79.                 break;
  80.             }
  81.             push(s, p->lchild);
  82.         }
  83.         if ( finded == 3 )
  84.         {
  85.             break;
  86.         }
  87.         else if ( parentnode != NULL )
  88.         {
  89.             while ( pop(s, p) && p == parentnode )
  90.             {
  91.                 break;
  92.             }
  93.             push(s, p->rchild);
  94.         }
  95.     }
  96.     return finded == 3 ? parentnode : NULL;
  97. }
  98. /****************************************************************************
  99. 题目要求 :一棵排序二叉树,令 f=(最大值+最小值)/2,设计一个算法,找出距离f值最近、大于f值的结点。 
  100. 复杂度如果是O(n2)则不得分。 
  101. 用C描述的算法,注释略
  102. ****************************************************************************/
  103. treenode* find_parentnode(tree, f)
  104. {
  105.     tempnode = tree;
  106.     while ( tempnode )
  107.     {
  108.         if ( tempnode->data > f )
  109.         {
  110.             if ( NULL == tree->lchild 
  111.             || tree->lchild->data <= f )
  112.             {
  113.                 break;
  114.             }
  115.             tempnode = tree->lchild;
  116.         }
  117.         else
  118.         {
  119.             if ( NULL == (tempnode = tempnode->right)
  120.             || tempnode->data > f )
  121.             {
  122.                 break;
  123.             }
  124.         }
  125.     }
  126.     return tempnode;
  127. }
  128. /****************************************************************************
  129. 题目要求 :一个整数数列,元素取值可能是1~N(N是一个较大的正整数)中的任意一个数,相同数值不会重复出现。
  130. 设计一个算法,找出数列中符合条件的数对的个数,满足数对中两数的和等于N+1。 
  131. 复杂度最好是O(n),如果是O(n2)则不得分。 
  132. 用C描述的算法,注释略
  133. ****************************************************************************/
  134. int get_numberpair_count(array, size, N)
  135. {
  136.     count = 0;
  137.     temp_array_size = N / 2 + 1;
  138.     temp_index = 0;
  139.     temp_array[temp_array_size];
  140.     for ( i = 0; i < size; ++i )
  141.     {
  142.         temp_index = array[i] < temp_array_size ? array[i] : (N-array[i]);
  143.         if ( temp_array[temp_index] == 1 )
  144.         {
  145.             ++count;
  146.         }
  147.         else
  148.         {
  149.             temp_array[temp_index] = 1;
  150.         }
  151.     }
  152.     return count;
  153. }
原创粉丝点击