有数组 a 和整数 m ,另创建数组 arry[m] ,arry[i] 保存的是 i 在数组 a 中出现的次数,我写了两个方法,但都觉得不好,请问你们有什么好的方法吗?
private static int[] histogram01(int[] a, int m) {
int[] arry = new int[m];
int count = 0;
for (int i = 0; i < m; i++){
for (int j = 0; j < a.length; j++){
if (a[j] == i) count++;
}
arry[i] = count;
count = 0;
}
return arry;
}
```java
private static int[] histogram02(int[] a, int m) {
Arrays.sort(a);
int[] arry = new int[m];
int num = 0;
int count = 0;
for ( int i = 0, j = 0; i < m; i++){
if ( i == (num = a[j])){
for (; j < a.length && a[j] == num; j++){
count++;
}
arry[i] = count;
count = 0;
}
}
return arry;
}
```
数组array 有m个元素的索引是 0 到 m-1
遍历a数组,小于 m 的值,就让数组array对应索引的元素加1
例如,m = 10; int[] arry = new int[10];
如果a[1]的是8, 就让 arry[8] = arry[8] + 1; 相当于 找到一次 8
如果a[1]的是11,超过了m就不计数。
private static int[] histogram01(int[] a, int m) {
int[] arry = new int[m];
for (int i = 0; i < a.length; i++){
if(a[i] < m){
arry[a[i]]++;
}
}
return arry;
}
private static int[] histogram01(int[] a, int m) {
int[] arry = new int[m];
for (int i = 0; i < m; i++){
arry[a[i]]++;
}
return arry;
}
思路:
arry初始化之后本来就全是0,对应计数++就行了,不需要双重循环每次只计算其中一个。
两种比较短的,看你喜欢哪种
private static int[] histogram01(int[] a, int m) {
int[] arry = new int[m];
for (int num:a){
arry[num]++;
}
return arry;
}
private static int[] histogram01(int[] a, int m) {
int[] arry = new int[m];
Arrays.stream(a).forEach(num->arry[num]++);
return arry;
}
可以先对数组a进行排序,然后只要确定i在a中连续的长度即可