如题,给出数组{2,5,2,4,3,3,9,6},求其中重复最多的数。若有几个数重复次数相同,则取数值最小的。
先给出代码,再说思路。
public static void main(String[] args) {
// TODO Auto-generated method stub
int a[]=new int[]{2,5,2,4,3,3,9,6};
int b[]=new int[10];//其中所有元素初始为0
int max=0;//存储最大重复次数
int maxN=0;//存储最大重复次数对应索引
for(int i=0;i<a.length;i++) {
b[a[i]]++;
}
max=b[0];
for(int i=0;i<10;i++) {
if(max<b[i]) {
max=b[i];
maxN=i;
}else if(max==b[i]) {
if(maxN>i) {
maxN=i;
}
}
}
System.out.println(maxN);
}
其实最开始我想的时候,想要扫描N次,每次扫描都得到其中一个数值的重复次数,并将其放入一个容器,再将该数的数值放入一个容器。每次扫描结束根据情况更新便可。
但是这样做的结果是时间复杂度大,而且麻烦。并且数组其实提供给我们两个信息可以使用,一个是内容,一个是对应索引,如果我们这样做,只使用了数组的内容。
因此我们可以创建一个数组长度为10的数组,索引0对应的空间存放0出现的次数,其他也是如此。这样下来我们便只需要扫描整个数组一遍,使用b[a[i]]++实时增加重复次数。最后找出其中最大值,取索引。若遇到相同最大值,则取较小索引便可。