给定一个 1-100 的整数数组,请找到其中缺少的数字

1,518 阅读1分钟

知识点

  • 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);
	}
}