阿里巴巴的一道筆試題

2021-06-29 14:02:36 字數 1601 閱讀 4153

分布式系統中的rpc請求經常出現亂序的情況。

寫乙個演算法來將乙個亂序的序列報序輸出,列如,假設起始序號是1,對於(1,2,5,8,10,4,3,6,9,7)這個序列,輸出是

3,4,5

7,8,9,10

上述例子中,3到來的時候發現4,5已經在了,因此將已經滿足順序的整個序列(3,4,5)輸出為一行。

要求:1.寫乙個高效的演算法完成上述功能,實現要求盡可能的健壯,易於維護

2.為該演算法完成單元測試。

先說下我的思路:

題目說了是rpc請求,那麼在傳送過程中傳送的包序號應該是1,2,3,4...,這裡應該不用考慮丟包吧 - -。

那麼這個亂序的序號,實際上就是順序的序號打亂了,所以按順序輸出後不可能出現1,2,4,5...類似這種情況。

接著看給出的序列是1到10亂序,輸出卻是順序的,只不過分塊輸出了。

看看輸出結果可能沒什麼頭緒,但是重點的一句話:

3到來發現4,5已經存在了,因此將滿足順序的整個序列(3,4,5) 輸出為一行。

更重點的詞:已經,滿足順序,一行。

已經存在說明3是在叫後面錄入(分析的意思),4,5已經分析過了但是不滿足輸出條件而已。這裡有個問題是為什麼3到來發現4,5存在了輸出,而不是4到來了發現

5已經存在了輸出?

我認為1,2輸出後,根據輸出結果來看,是順序輸出的,肯定要輸出3,所以一定要的等待3的出現才能順序輸出3,4,5。

那麼我假設規則:依次讀取每個資料,若讀到的其中乙個資料可以和前面輸出過的符合順序則輸出。

後面就好解釋了,1,2,3,4,5輸出後剩餘序列8,10,6,9,7。

讀入8,10,不符合,到6了,和已經輸出過的3,4,5符合順序序列,單獨輸出6。

剩餘序列8,10,9,7。

很簡單直到讀到7符合條件輸出順序序列7,8,9,10。

以上就是我思考的過程。羅嗦了...

我的解決方案:

每次選擇開頭元素和此刻最小元素的乙個區間,在這個區間的元素和最小的元素可以構成順序序列則輸出。

舉個例子,假設序列剩餘(5,8,10,4,3,6,9,7),那麼最小的元素是3。

區間是(5,8,10,4,3)。

分析可得3,4,5順序序列,輸出即可。然後刪除元素3,4,5,再次選取最小元素和區間就是6了。每次選取最小元素的區間就可以連線上已經輸出過的,保證是順序的。

**:

#include #include #include #include int main()

; std::setiset;

while(!ivec.empty())

else

}ivec.erase(remove(ivec.begin(), ivec.end(), del));

/* 輸出序列 */

一道阿里巴巴筆試題

今天看了阿里的一道筆試題 如下函式,在32bit 系統foo 2 31 3 的值是 int foo int x a 0 b 1 c 2 d 4 也沒想那麼多,覺得需要借助計算機程式設計才能得到答案!事實上呢,看看下面的程式和結果,你就明白了!cpp view plain copy include i...

阿里巴巴一道筆試題

其實這是谷歌的一道面試題 給定能隨機生成整數1到5的函式,寫出能隨機生成整數1到7的函式 慚愧,阿里的筆試題做錯了,說實話,以前沒見過,見過了就把搞懂 阿里題目 給定rand 7 表示能生成1 7的隨機數,使用四則運算和迴圈等控制語句,可以輸出的有 rand 3 b.rand 21 c.rand 2...

阿里巴巴筆試題

1 有乙個虛擬儲存系統,若程序在記憶體中佔3頁 開始時記憶體為空 若採用先進先出 fifo 頁面淘汰演算法,當執行如下訪問頁號序列後1,2,3,4,5,1,2,5,1,2,3,4,5,會發生多少缺頁?a 7 b 8 c 9d 10 2 設有乙個順序棧s,元素s1 s2 s3 s4 s5 s6依次進棧...