經典面試題解答(四)

2021-06-08 19:01:46 字數 1108 閱讀 6432

函式的宣告如下:

void deletenode(listnode* plisthead, listnode* ptobedeleted);  

分析:這是一道廣為流傳的google面試題,能有效考察我們的程式設計基本功,還能考察我們的反應速度,更重要的是,還能考察我們對時間複雜度的理解。

在鍊錶中刪除乙個結點,最常規的做法是從鍊錶的頭結點開始,順序查詢要刪除的結點,找到之後再刪除。由於需要順序查詢,時間複雜度自然就是o(n) 了。

我們之所以需要從頭結點開始查詢要刪除的結點,是因為我們需要得到要刪除的結點的前面乙個結點。我們試著換一種思路。我們可以從給定的結點得到它的下乙個結點。這個時候我們實際刪除的是它的下乙個結點,由於我們已經得到實際刪除的結點的前面乙個結點,因此完全是可以實現的。當然,在刪除之前,我們需要需要把給定的結點的下乙個結點的資料拷貝到給定的結點中。此時,時間複雜度為o(1)。

上面的思路還有乙個問題:如果刪除的結點位於鍊錶的尾部,沒有下乙個結點,怎麼辦?我們仍然從鍊錶的頭結點開始,順便遍歷得到給定結點的前序結點,並完成刪除操作。這個時候時間複雜度是o(n)。

那題目要求我們需要在o(1)時間完成刪除操作,我們的演算法是不是不符合要求?實際上,假設鍊錶總共有n個結點,我們的演算法在n-1總情況下時間複雜度是o(1),只有當給定的結點處於鍊錶末尾的時候,時間複雜度為o(n)。那麼平均時間複雜度[(n-1)*o(1)+o(n)]/n,仍然為o(1)。

#include

using namespace std;

typedef struct lnodelnode, *list;

void insertlist(list &l, int data)//頭插入節點

void printlist(list l)//列印鍊錶

coutif(!l || !tobedeleted)

return;

if(l==tobedeleted)//若刪除的節點時表頭

else

else//刪除節點時中間節點}}

void main()

else

deletenode(l, p);

cout<<"刪除後的鍊錶:";

printlist(l);

}

php 面試題 解答

第乙個問題關於弱型別 str1 yabadabadoo str2 yaba if strpos str1,str2 else正確執行的輸出結果 yabadabadoo does not contain yaba strpos是返回字串str2在str1的位置,沒有找到則返回false然而實際上這次返...

阿里面試題解答

1 澳大利亞父母喜歡女孩,所以一直要生到有乙個女孩為止。問多年後男女孩的比率。解答 生男孩的期望為e,e 1 1 4 2 1 8 3 1 16 n 1 2 n 1 1.因此男女孩的期望比就是1 1,男女孩的比率也是1 1 2 3 15時,鐘的分針與時針的角度多大。分針的角度是360 12 5 15 ...

linux C經典面試題 四

例子 code examples 12 下面的 輸出是什麼,為什麼?void foo void 這個問題測試你是否懂得c語言中的整數自動轉換原則,我發現有些開發者懂得極少這些東西。不管如何,這無符號整型問題的答案是輸出是 6 原因是當表示式中存在有符號型別和無符號型別時所有的運算元都自動轉換為無符號...