如何检查数组是否有两对不同的匹配值?

时间:2013-11-15 02:44:05

标签: java arrays

public static boolean hasTwoPair(int[] arrayOfInts){    
}

如果该方法可以找到两对不同的匹配int值,则该方法返回true。因此,如果数组是{2,2,4,7,7},它应该返回true,因为它有两个2和两个7。

它仅适用于不同的对值。如果它是{2,2,2,2,5},它将返回false,因为它们不是不同的对值。

编辑:这是我到目前为止对该方法的主体:

     boolean pairFound = false;
    int pairValue;

    for(int s = 0; s < arrayOfInts.length - 1; s++){
        pairValue = arrayOfInts[s];

        for(int c = s + 1; c < arrayOfInts.length; c++){
            if(pairValue == arrayOfInts[c])
                pairFound = true;
        }
    }

    return false; //placeholder

我不知道从哪里开始。

4 个答案:

答案 0 :(得分:2)

此任务要求您构建计数列表:

  • 创建一个数据结构(例如,Map<Integer,Integer>),其中包含数组中每个数字的计数。
  • 浏览地图,并计算计数为2及以上的条目数。
  • 如果您计算了两件或更多件商品,请返回true;否则,请返回false

第一个例子的计数如下:

V   #
-   -
2 - 2
4 - 1
7 - 2

您有两个项目(2和7),计数为2,因此请返回true

第二个例子的计数如下:

V   #
-   -
2 - 4
5 - 1

只有一个项目的计数大于2,因此请返回false

如果您使用HashMap,此算法会在O(n)中生成答案。

答案 1 :(得分:1)

由于您还没有尝试过任何代码,我将介绍如何解决此问题,但没有实际代码。

boolean开始,例如pairFound已初始化为false,并在找到第一个true时更改为pair。此外,您需要intpairValue来跟踪找到的第一对的价值(如果找到的话)。

迭代,寻找一对。如果您找到一对,pairFound为假,请将pairFound设置为true,并将pairValue设置为您首次找到pair的值。现在继续迭代。

如果您找到一对且pairFoundtrue且该对为!= pairValue,则为return true;。如果您遍历所有内容但尚未返回true,那么您可以return false


根据您更新的问题,您非常接近。

boolean pairFound = false;
int pairValue = Integer.MIN_VALUE;  
//or some value that arrayOfInts will never have based on context

for(int s = 0; s < arrayOfInts.length - 1; s++){
    if(arrayOfInts[s] == pairValue) { 
        continue; 
    }
    for(int c = s + 1; c < arrayOfInts.length; c++){
        if(arrayOfInts[s] == arrayOfInts[c]) {
            if(arrayOfInts[s] != pairValue) {
                if(pairFound) {    
                    return true;
                }
                pairValue = arrayOfInts[s];
                pairFound = true;
                break;
            }
        }
    }
}
return false;

答案 2 :(得分:0)

对数组进行排序。然后查找匹配的前两个连续值。如果找到,请跳至与匹配对不同的第一个条目并重复。如果在第一次或第二次搜索成功之前到达数组的末尾,则返回false

答案 3 :(得分:0)

您不需要对数组进行排序,这会给O(n * log(n))带来复杂性。但是你现在的解决方案更糟糕,因为它产生了O(n ^ 2)的复杂性。但是你也不需要HashMap。 Set和一个整数就足够了:

  • 对于每个数组元素
    • 检查:是否已经在集合中的元素?
      • 如果没有把它放入集合
      • 如果是,请检查它是否等于您最后找到的Int对(是的,使用盒装Int,而不是原始int,以便能够使用null对其进行初始化)
        • 如果等于继续
        • 如果它不相等
          • 如果找到的最后一对是null,请将其设置为元素值
          • 否则你已经完成了,你至少有两对不同
  • 如果您在未达到最后条件的情况下迭代列表,则表示您没有2对不同

至于Set实现,我建议HashSet

但这里还有更多要说的。如果你像这样实现它,你不假设整数和可索引数组。您只需要一个可比元素列表。因此,您可以使您的方法的签名更通用:

public static boolean hasTwoPair(Iterable<E> iterable)

但由于数组不支持泛型和Iterable接口,因此该方法的每个客户端都必须使用asList()方法将Array参数转换为Iterable。如果这太不方便你可以提供另一种方法:

public static <T> boolean hasTwoPair(T[] array)

一般来说,在设计API时使用最通用的类​​型是个好主意(另见“Effective Java,Second Edition”中的第40和52条)