在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 实用程序类来解决该问题。
方法:
- 从给定数组中找到缺失元素的数量, missCnt 。
- 创建一个以n作为参数的 BitSet 类对象。
- 对于给定数组中的每个数字,使用 BitSet.set() 方法将其倒数第二位设置为 true。
- 初始化一个整型变量lastMissIndex,用来存储最后一个缺失元素的索引。
- 使用从 0 到missCnt的 for 循环,使用 BitSet.nextClearBit() 方法从lastMissIndex找到设置为 false 的第一个位。
- 将 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