编写一个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();
}