检查数组中的多个元素

时间:2013-11-27 15:11:39

标签: java arrays

按模式,我正在检查数组是否有重复项。我在此处查看了类似的问题,但他们使用包含ArrayListHashMap的答案解决了问题。我不熟悉它们并试图用数组来回答它。我的以下代码仅适用于1个重复,无法执行多个重复检测。

public class Mode {

    public static void main(String[] args) {
        int[] num = {2,3,4,5,8,8,8,7,7,7};
        int mode = mode(num);
        System.out.println(mode);
    }

    public static int mode(int[] num){
        for(int x=0; x < num.length; x++){
            for(int y=x+1; y < num.length; y++){
                if(num[x] == num[y]){
                    return num[x]; 
                }
            }
        }
        return num[0]; 
    }
}

3 个答案:

答案 0 :(得分:1)

方法mode应该返回包含重复项而不是int的{​​{3}}。另请注意,内部循环不正确。你应该这样做:

public static HashSet<Integer> mode(int[] num){
    HashSet<Integer> dup = new HashSet<>();
    for(int x=0; x < num.length; x++) {
       for(int y=0; y < num.length; y++) {
          if(num[x] == num[y] && x != y) {
              dup.add(num[x]); 
          }
       }
    }
    return dup;
}

该溶液为O(n 2 )。如果您:

,您可以获得更好的解决方案
  • 对数组进行排序。
  • 旅行(只有一次),如果num[i] == num[i + 1],那就是重复。

此解决方案为O(n * log(n)) - 仅对阵列进行一次排序和传输。

答案 1 :(得分:0)

如果您需要所有重复项的列表,此代码将为您提供答案。如果您只想要重复的数字,请使用@Stefan中的代码。

import java.util.Arrays;

public class Mode {

  public static void main(String[] args) {
    int[] num = {2, 3, 4, 5, 8, 8, 8, 7, 7, 7};
    int[] mode = mode(num);
    int i;
    System.out.print("The duplicates are: ");
    for (i = 0; i < mode.length - 1; i++) {
      System.out.print(mode[i] + ", ");
    }
    System.out.println(mode[i] + ".");
  }

  public static int[] mode(int[] num) {
    int numberOfDuplicates = 0;
    int[] duplicates = new int[num.length];
    Arrays.sort(num);
    for (int i = 1; i < num.length; i++) {
      if (num[i - 1] == num[i]) {
        duplicates[numberOfDuplicates++] = num[i];
      }
    }
    return Arrays.copyOf(duplicates, numberOfDuplicates);
  }
}

答案 2 :(得分:-1)

  1. 您需要为模式方法而不是单个int返回HashSet或LinkedHashSet。
  2. 第一个声明是INCORRECT。一定是

    for (int x=0; x < num.length - 1; x++)  //--- You used x < num.length
    
  3. 源代码如下所示

    Set<Integer> result = new HashSet<Integer>();
    for(int x=0; x < num.length - 1; x++) {
        boolean duplicated = false;
        for(int y=x+1; y < num.length; y++) {
            if(num[x] == num[y]) {
                duplicated = true;
                break;  
            }
        }
        if (duplicated) result.add(num[x]);
    }
    return result;