宁波网站怎么建设,网站建设 深圳,单页营销网站模板,做外贸公司网站多少钱用4KB内存寻找重复元素
给定一个数组#xff0c;包含从1到N的整数#xff0c;N最大为32000#xff0c;数组可能还有重复值#xff0c;且N的取值不定#xff0c;若只有4KB的内存可用#xff0c;该如何打印数组中所有重复元素。
如果不要求使用4KB#xff0c;最简单就是…用4KB内存寻找重复元素
给定一个数组包含从1到N的整数N最大为32000数组可能还有重复值且N的取值不定若只有4KB的内存可用该如何打印数组中所有重复元素。
如果不要求使用4KB最简单就是使用N长的数组然后将元素都存入数组再打印但是题目规定了4KB很显然这种做法就不大行了一定会超出时间限制。
4KB4 * 8 * 2 ^ 10 比特这个值是大于32000可以使用比特数组来存储相应的元素。利用这个位向量就可以遍历访问整个数组。如果发现数组元素是v那么就将位置为v的设置为1碰到重复元素就输出。代码就没什么可说的真要实现起来还是有一点复杂的。
public class FindDuplicatesIn32000 {public void checkDuplicates(int[] array) {BitSet bs new BitSet(32000);for (int i 0; i array.length; i) {int num array[i];int num0 num - 1;if (bs.get(num0)) {System.out.println(num);} else {bs.set(num0);}}}class BitSet {int[] bitset;public BitSet(int size) {this.bitset new int[size 5];}boolean get(int pos) {int wordNumber (pos 5);//除以32int bitNumber (pos 0x1F);//除以32return (bitset[wordNumber] (1 bitNumber)) ! 0;}void set(int pos) {int wordNumber (pos 5);//除以32int bitNumber (pos 0x1F);//除以32bitset[wordNumber] | 1 bitNumber;}}
}