在排序的数组中查找缺少的整数

时间:2016-09-30 20:54:16

标签: java arrays quicksort

我必须在长度为10的数组中找到缺失的整数(在0-9范围内随机生成)。我有想法对数组进行排序,然后检查每个数组是否等于其中的位置阵列。我想出了以下代码:

public void nichtGetroffen(){
    s.quickSort(enten, 0, enten.length -1);
    sum = 0;
    for (int i=0; i < enten.length; i++){ 
        if(enten[i] != i){
            System.out.print(i + "");
            sum = sum +1;
        }
    }

问题在于它有时会起作用,有时却不起作用,遗憾的是我不知道如何解决这个问题。 (enten是数组的名称)

5 个答案:

答案 0 :(得分:1)

如果对数组进行排序,如果下一个元素比当前元素大1以上,则表示您缺少数字。然后,只需在数组的开头和结尾查找缺少的数字。

s.quickSort(enten, 0, enten.length -1);

// Print missing numbers less than the smallest element.
for (int j = 0; j < enten[0]; ++j) {
  System.out.println(j);
}

// Print missing numbers between elements.
for (int i = 1; i < enten.length; ++i) {
  // If enten[i - 1] + 1 >= enten[i], this loop body never runs.
  for (int j = enten[i - 1] + 1; j < enten[i]; ++j) {
    System.out.println(j);
  }
}

// Print missing numbers greater than the largest element.
for (int j = enten[enten.length-1] + 1; j <= 9; ++j) {
  System.out.println(j);
}

答案 1 :(得分:1)

以下是一个不起作用的原因示例:

假设已排序的数组包含以下数字:1 2 3 4 5 6 7 8 9 9。这个数组中缺少多少个数字?只有一个。我们错过了号码0

他们“正确”的地方有多少人?只有最后一个9。这就是为什么您的代码将返回9而不是1

答案 2 :(得分:0)

如果我确实很好地记下了你的问题,请用你得到的数组填充set集合,然后检查长度是否等于10。

HashSet<Integer> set = new HashSet<>(arrayOfRandomNumbers);
if (set.size() == 10) {
   //all elements in array
}

答案 3 :(得分:0)

这样做的一种方法是使用Set及其仅具有唯一元素的属性:

public static void main(String[] args) {
    // randomizing
    int nMin = 5;
    int nMax = 50;
    int x = 20;
    Random r = new Random();
    Integer[] arr = new Integer[x];
    for (int i = 0; i < x; i++) {
        int val = nMin + r.nextInt(nMax - nMin);
        System.out.println(val);
        arr[i] = val;
    }

    // detection

    Set<Integer> set = new HashSet<Integer>(Arrays.asList(arr));
    List<Integer> missing = new ArrayList<>();
    for (int i = nMin; i < nMax; i++) {
        if (!set.contains(i)) {
            missing.add(i);
        }
    }

    System.out.println("Missing elements count " + missing.size());
    System.out.println("Missing elements: " + missing.toString());
}

这将为您提供nMin(5)和nMax(50)之间的X(20)随机整数集中所有缺失的intergs;

答案 4 :(得分:0)

这是您原始任务的完整解决方案&#34;你在评论中提到过:

public class Gaps {
    public static void main(String[] args) {
        int runs = 100;
        int nMin = 0;
        int nMax = 10;
        int x = 10;

        double missingSum = 0;

        for (int run = 0; run < runs; run++) {
            Integer[] arr = randomize(nMin, nMax, x);
            List<Integer> missing = getMissingElements(nMin, nMax, arr);
            missingSum += missing.size();
        }
        double avg = missingSum / runs;
        System.out.println("Missing elements avarage count: " + avg);

    }

    private static List<Integer> getMissingElements(int nMin, int nMax, Integer[] arr) {
        Set<Integer> set = new HashSet<Integer>(Arrays.asList(arr));
        List<Integer> missing = new ArrayList<>();
        for (int i = nMin; i < nMax; i++) {
            if (!set.contains(i)) {
                missing.add(i);
            }
        }
        return missing;
    }

    private static Integer[] randomize(int nMin, int nMax, int x) {
        Random r = new Random();
        Integer[] arr = new Integer[x];
        for (int i = 0; i < x; i++) {
            int val = nMin + r.nextInt(nMax - nMin);
            arr[i] = val;
        }
        return arr;
    }

}