2010-08-05 88 views
-2

數組共有101個值。此數組包含從1到100的數字,並且一個數字正在重複(兩次)。編寫僞代碼來查找重複編號。psuedo代碼找到重複的號碼?

+2

這是什麼?家庭作業?挑戰?垃圾郵件? – 2010-08-05 10:09:10

+0

同意,它幾乎看起來像一個剪切和粘貼的任務! – 2010-08-05 10:16:54

回答

0
  1. 你可以散列值和檢測 衝突
  2. 你可以對數組進行排序,然後循環 它發現重複
  3. 你可以搜索陣列(長 慢!)

如果你想變得聰明,看看哈希。如果你想玩它簡單和安全,使用合併排序對列表進行排序,然後循環索引可能是最好的。

+0

排序數組將是O(N log N),這就是如果你選擇一個體面的排序算法。具有「看到」標誌陣列的線性搜索會更快(O(N),操作不重要)。然而,最後一部分是關鍵 - 比較每個條目的確是「漫長而緩慢的」,所以除非有O(1)種方式回答「我之前看過這個數字嗎?」這個問題,否則不要這樣做。 。 – cHao 2010-08-05 10:33:52

+0

雖然你看到「國旗」怎麼樣?那就是問題所在! – 2010-08-05 10:58:52

+0

在提供集合或字典的語言中很容易。遍歷數組,如果它不在那裏,則向數組添加一個數字。如果是這樣,你有你的副本。 – 2010-08-05 13:00:46

0

我將所有的索引加起來[0] - > [100]找出1 + 2 + 3 ... + 100應該等於從結果中減去該值,並得到重複數。

所以你只需要一個簡單的

forwhile循環經歷的每個索引,然後減去2,你有你的結果。

喜歡的東西...

q = 0; 
p = 101 * 50; 
for(i<=100; i <array.length; i++){ 
q += q + array[i] 
} 
repeating number = q-p; 
+0

聰明:)(和一些強制性的噪音達到「足夠」的字符) – sarnold 2010-08-05 10:18:05

+0

你甚至不需要添加所有數字1到100來找出總數。它只是101 * 50 = 5050. – Guffa 2010-08-05 10:21:42

+0

作爲參考,計算1 + 2 + 3 + ... + 100的簡單方法是「(1 + 100)* 100/2」。適用於任何兩個數字;只需用低數字代替'1',用高數字代替'100'。 – cHao 2010-08-05 10:21:48

0

試試這個(C#):

int[] array = ... ; // initialize appropriately 
var hashSet = new HashSet<int>(); 
var indexOfDuplicate = -1; 
for (var i = 0; i < array.Length; i++) { 
    if (hashSet.Contains(array[i])) { 
     indexOfDuplicate = i; 
     break; 
    } 
    hashSet.Add(array[i]); 
} 
var duplicateNumber = array[indexOfDuplicate]; 

有了這個解決方案,您將有重複的號碼(第2發生)和重複數的兩個指標。

0

Set set;

對於陣列中的每個p { set.add(p); }

print(set);