知识点
- BitSet的应用场景:海量数据去重、排序、压缩存储
- BitSet的基本操作 and(与)、or(或)、xor(异或)
/**
* <h1>给定一个1-100的整数数组,请找出其中缺失的数字</h1>
* <p>BitSet详解</p>
* <u>
* <li>BitSet的应用场景:海量数据去重、排序、压缩存储</li>
* <li>BitSet的基本操作 and(与)、or(或)、xor(异或)</li>
* </u>
**/
public class MissingNumberInArray {
/**
* 缺少一个数字的计算方式
* @param numbers
* @param totalCount
* @return
*/
private static int getMissingNumber(int[] numbers,int totalCount){
int expectedSum = totalCount *((totalCount+1)/2);
int actualSum = 0;
for (int i : numbers){
actualSum += i;
}
return expectedSum - actualSum;
}
/**
* 海量数据去重、排序、压缩存储
* @param numbers
* @param count
*/
private static void printMissingNumber(int[] numbers,int count){
int missingCount = count-numbers.length;
BitSet bitSet = new BitSet(count);
//数据是从1开头的,这里是获取下标索引
for (int number:numbers){
bitSet.set(number - 1);
}
System.out.println("一共有"+count+"个数据:目前数组为"+ Arrays.toString(numbers));
int lastMissingIndex = 0;
for (int i = 0; i < missingCount; i++) {
//返回下个清零位的索引,(即,下一个零位),从由startIndex指定的索引开始,bitSet.nextClearBit(lastMissingIndex)返回的是下一个缺失的索引
lastMissingIndex = bitSet.nextClearBit(lastMissingIndex);
System.out.println(++lastMissingIndex);
}
}
public static void main(String[] args) {
printMissingNumber(new int[]{1, 2, 3, 4, 6, 9}, 10);
}
}