2011-08-04 60 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),没有额外的空间,除了计数器

相关问题