📌  相关文章
📜  在Java中使用 BitSet 从整数数组中查找缺失的数字

📅  最后修改于: 2022-05-13 01:55:49.968000             🧑  作者: Mango

在Java中使用 BitSet 从整数数组中查找缺失的数字

给定一个由 1 到 n 组成的整数数组,您需要从数组中找出缺失的数字。

例子:

Input : n = 5, a[] = {1, 2, 4, 5}
Output: 3
Explanation: From the array of numbers 1 to 5, 3 is missing.

Input : n = 10, a[] = {1, 3, 4, 6, 8, 10}
Output: 2, 5, 7, 9
Explanation: From the array of numbers 1 to 10, 2, 5, 7 and 9 are missing.

这个问题可以很容易地解决,通过计算n个数字的总和,用公式,

sum = (n * (n + 1)) / 2

本文给出了这种方法的解决方案。

但是,这种方法不能用于数组包含多个缺失数字的情况。

对于这种情况,可以使用Java中的 BitSet 实用程序类来解决该问题。

方法:

  1. 从给定数组中找到缺失元素的数量, missCnt
  2. 创建一个以n作为参数的 BitSet 类对象。
  3. 对于给定数组中的每个数字,使用 BitSet.set() 方法将其倒数第二位设置为 true。
  4. 初始化一个整型变量lastMissIndex,用来存储最后一个缺失元素的索引。
  5. 使用从 0 到missCnt的 for 循环,使用 BitSet.nextClearBit() 方法从lastMissIndex找到设置为 false 的第一个位。
  6. 将 lastMissIndex增加到 1,并打印它。

下面是上述方法的实现

Java
// Java Program to find the missing elements
// from integer array using BitSet class
  
import java.io.*;
import java.util.*;
  
public class FindMissingNo {
    private static void findMissingNumbers(int arr[], int n)
    {
        int missCnt = n - arr.length;
        // create Bitset object b
        BitSet b = new BitSet(n);
        for (int i : arr) {
            b.set(i - 1);
        }
        int lastMissIndex = 0;
        for (int i = 0; i < missCnt; ++i) {
            lastMissIndex = b.nextClearBit(lastMissIndex);
            // print missing number
            System.out.println(++lastMissIndex);
        }
    }
    public static void main(String[] args)
    {
        int n = 10;
        // array of 10 numbers
        int[] arr = new int[] { 1, 2, 4, 6, 8, 9 };
        // call function
        findMissingNumbers(arr, n);
    }
}


输出
3
5
7
10