程式設計師面試一百題 05 查詢最小的k個元素

2021-09-02 22:00:06 字數 943 閱讀 3364

1-題目:

輸入n個整數,輸出其中最小的k個。

2-示例:

輸入1,2,3,4,5,6,7,8八個數,則最小的4個數為1,2,3,4

3-思路:

3.1-最簡單的思路就是將n個數排序,然後取出最小的k個數,但是這樣的時間複雜度為o(n*logn)。

3.2-我們嘗試更快的思路。可以開闢乙個長度為k的陣列karr,每次讀入乙個數,如果karr元素個數少於k個,則直接放入karr中;如果karr已經滿了,此時若讀入的數比karr中最大的數小,則替換該數。這樣karr裡維持的永遠是最小的k個數,時間複雜度為o(n+n*logk)。通常情況下k要遠小於n,所以這種辦法要優於前面的思路。

3.2注-當karr已經滿了之後,如果需要替換,每次替換的都是陣列中的最大值。在常用的資料結構中,能夠在o(1)時間裡得到最大值的資料結構為最大堆,因此我們可以用堆(heap)來代替陣列

4-**:

#include #include #include using namespace std;

typename multiset> intheap;

void findleastnumbers(const vector&data, intheap &leastnumbers, unsigned int k)

vector::const_iterator iter = data.begin();

for (; iter != data.end(); iter++)

else}}

}

程式設計師面試一百題 15 含有指標成員的類的拷貝

1 題目 下面是乙個陣列類的宣告與實現 請分析這個類有什麼問題,並針對存在的問題提出幾種解決方案。有問題的 template class arr arr void setvalue unsigned index,const t value t getvalue unsigned index cons...

程式設計師面試一百題 17 把字串轉換為整數

1 題目 輸入乙個表示整數的字串,把該字串轉換成整數並輸出。2 示例 輸入 345 輸出345。3 思路 題目並不難,但是很好能考察程式設計師的思維能力,因為很多程式設計細節需要考慮,例如正負數的判斷 首字母是否為0 空指標的處理 非法輸入的判斷等等。4 true表示輸入有效,false表示輸入非法...

程式設計師面試攻略題2

題目 刪除單向鍊錶的頭元素的函式。請找出其中的程式漏洞並加以糾正 void removehead node head 分析 在c語言裡,輸入引數都是以值傳遞的方式進入子函式的,換句話說,子函式所使用的 是輸入引數的乙個區域性副本,對這個區域性副本的修改不可能在該函式以外的地方被 看到 但在c語言裡,...