计算数组中重复数据的个数

编写一个int CountNumber(int[] a)方法,该方法的作用是计算a中包含重复数据的个数,例如:a={9,8,12,0,8,11,12,7,8,9},则方法需要返回3(说明:重复数据分别是9,8,12)

private void CountNumber(int[] a) {
        Set set = new HashSet();
        for (int i = 0; i < a.length; i++) {
            int i_ = a[i];
            for (int o=i+1;o<a.length;o++){
                if(a[o]==i_){
                    set.add(a[o]);
                }
            }
        }
        System.out.println(set.size());
    }

int[] a = {9, 8, 12, 0, 8, 11, 12, 7, 8, 9};
Set set = new HashSet();
for ( int b : a ) {
    set.add( b );
}
System.out.println( set.size() - a.length );

思路就是拿出数组中的每一个数去数组中对比,如果发现出现次数大于1的说明是重复的,就把这个数显示出来

这么传参的话,怎么知道数组a有多少个数据项呢?

1、排序,扫描。 省内存
2、构造一个长度为2^32次方的bit数组, 然后每个值放进去,比如
9,8,12,0,8,1
对应
bit[9]
bit[8]
bit[12]
速度快,但费内存,因为你不清楚数值里最大值有多少个。
3、用HashMap 类,内存和性能折中。
put(9,1)

可以利用HashSet的特性进行排重,HashSet不允许有重复值,将原数组的长度-HashSet的长度,就可以得到重复的个数

public static int CountNumber(int[] a) {
        HashSet<Integer> set = new HashSet<Integer>();
        for(int i=0; i<a.length; i++) {
            set.add(a[i]);
        }
        return a.length - set.size();
    }

排序,循环跟上一个值比较,相同的丢到HashSet里,返回HashSet的长度

 public int CountNumber(int[] arr) {
        Arrays.sort(arr);
        int temp = arr[0];
        HashSet<Integer> set = new HashSet<Integer>();
        for (int i = 1; i < arr.length; i++) {
            if (temp == arr[i]) set.add(arr[i]);
            temp = arr[i];
        }
        return set.size();
    }