微軟4道面試題

來源:互聯網
上載者:User

題目:

(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

(2)求兩節點的全路徑,然後求公用路徑

(3)

    a、找到最大值a,找到最小值b 求f  O(log(n))+ O(log(n))+ O(1)= O(log(n))
    b、找所求節點:O(log(n))
    找法:
      當f > node->data 則比較f和node->right 
      當f <= node->data 則比較f和node->left
      利用三個儲存量,分別記錄前一次比較的符號SymbolLast,本次比較的符號SymbolThis,及可能節點ansNode
      當SymbolLast = " <" 且 SymbolThis = ">" 時,記錄前一次值即ansNode= node->parent;

      結論:當比較過程中node->right = null時,結果為ansNode, 當node->left = null時 結果為node

(4)用雜湊.
建一個大小為(N+1)/2的雜湊表,雜湊表初始化為0.
遍曆數組:
(1).當arr[i] <=(N+1)/2時,將雜湊表中第i位置1.
(2).當arr[i]>(N+1)/2時,將arr[i]散列到第(N+1-i)位,如果雜湊表中此位為1,則列印i與N+1-i,並將雜湊表此位值置0.
複雜度O(n).

 

 

代碼:

 

/****************************************************************************
題目要求 :一個整數數列,元素取值可能是0~65535中的任意一個數,相同數值不會重複出現。0是例外,可以反覆出現。
請設計一個演算法,當你從該數列中隨意選取5個數值,判斷這5個數值是否連續相鄰。
注意:
- 5個數值允許是亂序的。比如: 8 7 5 0 6
- 0可以通配任意數值。比如:8 7 5 0 6 中的0可以通配成9或者4
- 0可以多次出現。
- 複雜度如果是O(n2)則不得分。

用C描述的演算法
功能 :判斷隨意取的數值是否連續相鄰,相鄰返回1,否則返回0
參數array :儲存隨意取的數
參數size :隨意取的數的個數
****************************************************************************/
int is_progression(array, size)
{
/*最大值的索引和最小值的索引*/
maxIndex = 0;
minIndex = 0;

i = 0;
/*試圖找到第一個不為0的元素,初始化maxIndex和minIndex*/
for ( ; i < size; ++i )
{
if ( array[i] != 0 )
{
maxIndex = minIndex = i;
break;
}
}

/*試圖確定隨意取的數中的最大值和最小值*/
for ( ; i < size; ++i )
{
if ( array[i] > array[maxIndex] )
{
maxIndex = i;
}
else if ( array[i] < array[minIndex] )
{
minIndex = i;
}
}

/*如果最大值和最小值的差小於總個數,則可以判定它們是連續相鄰的*/
return (array[maxIndex] - array[minIndex]) < size ? 1 : 0;
}

/****************************************************************************
題目要求 :設計一個演算法,找出二叉樹上任意兩個結點的最近共同父結點。
複雜度如果是O(n2)則不得分。

用C描述的演算法,注釋略
****************************************************************************/
typedef int datatype
typedef struct tree_node{
datatype data;
struct tree_node *lchild;
struct teee_node *rchild;
}treenode, *lptreenode;
treenode* find_parentnode(tree, node1, node2)
{
initstack(s);
push(s, tree);
finded = 0;
parentnode = tree;

while ( !stackempty(s) )
{
while ( gettop(s, p) && p )
{
if ( p == node1 )
{
finded += 1;
}
if ( p == node2 )
{
finded += 1;
}

if ( finded == 0 )
{
parentnode = p;
break;
}
else if ( finded == 2 )
{
break;
}

push(s, p->lchild);
}

if ( finded == 3 )
{
break;
}
else if ( parentnode != NULL )
{
while ( pop(s, p) && p == parentnode )
{
break;
}

push(s, p->rchild);
}
}

return finded == 3 ? parentnode : NULL;
}

/****************************************************************************
題目要求 :一棵排序二叉樹,令 f=(最大值+最小值)/2,設計一個演算法,找出距離f值最近、大於f值的結點。
複雜度如果是O(n2)則不得分。

用C描述的演算法,注釋略
****************************************************************************/
treenode* find_parentnode(tree, f)
{
tempnode = tree;
while ( tempnode )
{
if ( tempnode->data > f )
{
if ( NULL == tree->lchild
|| tree->lchild->data <= f )
{
break;
}

tempnode = tree->lchild;
}
else
{
if ( NULL == (tempnode = tempnode->right)
|| tempnode->data > f )
{
break;
}
}
}

return tempnode;
}

/****************************************************************************
題目要求 :一個整數數列,元素取值可能是1~N(N是一個較大的正整數)中的任意一個數,相同數值不會重複出現。
設計一個演算法,找出數列中合格數對的個數,滿足數對中兩數的和等於N+1。
複雜度最好是O(n),如果是O(n2)則不得分。

用C描述的演算法,注釋略
****************************************************************************/
int get_numberpair_count(array, size, N)
{
count = 0;
temp_array_size = N / 2 + 1;
temp_index = 0;

temp_array[temp_array_size];

for ( i = 0; i < size; ++i )
{
temp_index = array[i] < temp_array_size ? array[i] : (N-array[i]);
if ( temp_array[temp_index] == 1 )
{
++count;
}
else
{
temp_array[temp_index] = 1;
}
}

return count;
}

 

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.