2013-11-21 128 views
4

我有一個隨機數發生器,它生成1 to k之間的數字。我也有int類型的數組(即int[]),其大小爲N,其中k小於N.保存排序中的元素的算法維護順序

現在的問題是我需要將唯一生成的數字保存到數組中(拒絕生成的重複數字)並且必須維護生成的數字的順序,而不使用任何額外的空間和複雜度。即我同樣的陣列我需要維護生成的數量的順序也。以便我可以按照生成的順序檢索它們。沒有位圖或額外的數組等是假設使用。

它不是一個功課。它是面試問題之一。我不應該使用任何額外的空間。他要求我使用k小於N的事實,並且您需要在同一陣列中灌輸hashmap的行爲。我提出了許多使用額外空間的算法,但他也拒絕使用排序,但我無法維持生成的順序。

+0

如果我是你,我會1)保存我的元素到一個排序列表,2)當我完成時調用toArray()。 http://stackoverflow.com/questions/4031572/sorted-array-list-in-java。 PS:這聽起來像功課? – paulsm4

+1

你能告訴我們到目前爲止你有什麼代碼嗎?你在考慮什麼方法? –

+0

「*不使用任何額外的空間*」似乎是不可能的任務。即使是交換,你也需要需要4個字節的「int temp」。 –

回答

5

好的,我會買這不是功課。這是解決方案。假設K = 3,N = 5

開始:

ar[0] = 0 
ar[1] = 0 
ar[2] = 0 
ar[3] = 0 
ar[4] = 0 

生成一個隨機數。假設它是2.我們需要現在存儲兩位信息:

  • 「2」是第一個隨機數。
  • 採取「2」。

所以我們這樣做:

ar[0] = 2 
ar[1] = 0 
ar[2] = 10 // 10 is any number that's larger than N. 
ar[3] = 0 
ar[4] = 0 

下一個數字:4

ar[0] = 2 
ar[1] = 4 
ar[2] = 10 // taken 
ar[3] = 0 
ar[4] = 10 // taken 

下一個數字:2

ar[2] >= 10 thus taken, try another number 

下一個數字:1

ar[0] = 2 
ar[1] = 14 // added 10 to signify it's taken 
ar[2] = 11 // added 1 as it's the current number 
ar[3] = 0 
ar[4] = 10 // taken 

完成。

現在,遍歷數組,並從一切比10大10減去你會

ar[0] = 2 
ar[1] = 4 
ar[2] = 1 
ar[3] = 0 
ar[4] = 0 

一個需要注意的結束 - 這是假定隨機數是[1..N]範圍。如果他們是[0..N-1],你必須調整一下。

+0

這樣的算法是否有名字? –

+0

@iluxa:可能你的意思是添加'N * 2'而不是'k * 2'。添加'k * 2'將導致不確定性,無論數字是否已被採用,或者它只是一個正在生成的數字(例如對於'k = 2'和'array [1] = 5',您不需要知道它是否真的生成了第5個數字,沒有生成1,或者生成了1,結果是1,用'N * 2'(實際上'N'就足夠了),你可以檢查數字是否如果它大於'N',那麼減去'N',這個算法將是正確的,因爲最大值是'N',所以任何> N'都表示有東西在那裏。 – justhalf

+0

只生成數字go最多爲k,所以我認爲〜k + 1就足夠了,但是嘿,N * 2 + 1000000對於好的價值 – iluxa