2011-08-04 63 views
2

有誰知道我會如何解決數組中的所有元素,但一個具有相同的值?找出是否所有的,但只有一個數組元素是相同的

我一直在努力工作,但不能解決它。例如,測試一個包含5個元素的數組,看它是否有4個相同的值。

感謝

+0

所以java **或** C?他們是不同的語言,所以你最好選擇一個。 –

+0

哦,並且注意C也不是** C++。 –

回答

2

分步:

  1. 獲取的第一要素。
  2. 循環所有數組元素並計算它們不與 匹配的第一個元素的次數。

    • 如果所有的元素匹配,你有你的答案(都是平等的)。
    • 如果只有一個元素不匹配,則表示您的答案(其中一個 不同)。
    • 如果某些元素不匹配,則說明您的答案(超過 則不同)。
  3. 在沒有元素匹配的情況下,獲取第二個元素並重復 測試。

    • 如果只有一個元素不匹配,再次只有一個不同(第一個)。
    • 否則,不同元素的數量大於1。
4

使用地圖。

Map<X, Integer> map = new HashMap<X, Integer>(); // where X is the array type 
Integer ct; 
for(X item : array){ 
    ct = map.get(item); 
    if(ct == 0) ct = Integer.valueOf(1); 
    else ct = Integer.valueOf(ct.intValue()+1); 
    map.put(item, ct); 
} 
// now test if map.values() consists of Integer.valueOf(1) and (optionally) 
// another positive integer (thx aioobe) 
+0

+1我喜歡它!使用API​​ – Bohemian

+0

我相信你錯過了一個'else'。 – aioobe

+0

@aioobe正確,thx,也改變了我的代碼,只做了1項查找每個項目 –

1

我會選擇的方法是:

迭代所有元素,並把它們放在一個地圖(HashMap的Java中)。

關鍵是元素,值是外觀的計數器。

例如:您的陣列:AAAAB

地圖:

A - > 4 乙 - > 1

您已經構建之後,地圖很容易找到,如果你的陣列匹配標準。

  1. 該地圖必須只有2個元素(map.size())。
  2. 完全元素中的一個具有計數器1

如果您認爲增加的地圖在固定時間內發生了,你就會有2N的整體複雜性(遍歷數組和遍歷圖)。

2

我想出了這招:-)

public static boolean allButOneSame(int[] arr) { 
    if (arr.length <= 1) 
     return arr.length == 1; 

    Arrays.sort(arr); 

    return arr[0] != arr[arr.length-1] && 
      (arr[0] == arr[arr.length-2] || 
      arr[1] == arr[arr.length-1]); 
} 

(可比數值,如整數憑藉雖然!)

+0

這只是要求的一部分,但它很好,很簡單(+1) –

+0

哪些部分的要求缺失?...哦,你的意思是我假設整數。真的! – aioobe

+0

發表了一個更通用的解決方案,考慮到任意類型[這裏](http://stackoverflow.com/questions/6940317/figuring-out-if-all-but-one-array-elements-are-identical/6941102# 6941102):-) – aioobe

0

這裏的另一種方法:

public static <Item> boolean allButOneSame(List<Item> items) { 

    // Make sure we have 2 different elements (or 1 element in total) 
    if (new HashSet<Item>(items).size() != 2) 
     return items.size() == 1; 

    // Create a temporary copy 
    List<Item> tmp = new ArrayList<Item>(items); 

    // Remove all elements equal to the first one. 
    tmp.removeAll(Collections.singleton(items.get(0))); 

    // Check the number of remaining elements. 
    return tmp.size() == 1 || tmp.size() == items.size() - 1; 
} 

它需要一個List作爲輸入。如果以數組開頭,則使用Arrays.asList

0

你也可以添加所有的數組元素爲LinkedHashSet(無重複,插入順序被保存),並期待在該組的.size()

+0

如果大小是2? :) – aioobe

1
  1. 迭代陣列,由第一元件,並且x + 1個元素,其中x是比較2,3,4,... array.length()
  2. 如果比較失敗則遞增計數器

如果((計數器== 0)||((計數器> 1)& &(計數器!= array.length-1)))然後condi灰不滿足

計數器= 0表示,所有都是相同的元件

計數器= array.length-1裝置的排序順序例如:4,5,5,5,5,5,5

複雜性 - >時間:O(n),沒有額外的空間,除了計數器

相關問題