在网上看到一个算法题,不是很难,搜一下也有解决办法,但是一般都是几层for循环,试着写了下
/**
* 给你一组字符串 如 {5,2,3,2,4,5,1,2,1,5},让你输出里面出现次数最多且数值最大的一个,出现几次
* 优点:时间复杂度为O(n)
* 缺点:产生一些多余的空间,如 6,7,8没有的数也会分配一个数组空间,但是基本可以忽略
* 限制:需要预先知道最大的值是多少,或者说小于多少,这样才好确定预先分配一个数组长度是多少
*/
public static void method1(){
int[] datas = {5,2,3,2,4,5,1,2,1,5};
int[] nums = new int[10];//0-9,此处若数组中的最大值为 123,则数组长度应为 >= 124
for (int i = 0; i < datas.length; i++) {
int n = datas[i] - 0;
nums[n]++;
}
int maxTime = 0;
for (int i = 0; i < nums.length; i++) {
System.out.println(i+":"+nums[i]);
if(nums[i] > maxTime){
maxTime = nums[i];
}
}
System.out.println("最多的出现"+maxTime+"次");
int num = 0;
for (int i = 0; i < nums.length; i++) {
if(maxTime == nums[i]){
num = i;
}
}
System.out.println("出现次数最多:"+maxTime+"次;且最大的数是:"+num);
}
/**
* 给你一组字符串 如 {5,2,3,2,4,5,1,2,1,5},让你输出里面出现次数最多且数值最大的一个,出现几次
* 优点:时间复杂度为O(n)
* 缺点:暂时没发现
*/
public static void method2(){
int[] datas = {5,2,3,2,4,5,1,2,1,5};
Map<Integer,Integer> map = new HashMap<Integer, Integer>();
for (int i = 0; i < datas.length; i++) {
Integer key = datas[i];
Integer value = map.get(key);
if(value != null){
map.put(key, ++value);
}else{
map.put(key, 1);
}
}
int maxTime = 0;
int maxTime_num = 0;
Set<Integer> keySet = map.keySet();
Iterator<Integer> it = keySet.iterator();
while(it.hasNext()){
Integer key = it.next();
Integer value = map.get(key);
System.out.println(key+":"+value);
if(value >= maxTime){
maxTime = value;
if(key > maxTime_num){
maxTime_num = key;
}
}
}
System.out.println("出现次数最多:"+maxTime+"次;且最大的数是:"+maxTime_num);
}
打印:
0:0
1:2
2:3
3:1
4:1
5:3
6:0
7:0
8:0
9:0
最多的出现3次
出现次数最多:3次;且最大的数是:5
-----------
1:2
2:3
3:1
4:1
5:3
出现次数最多:3次;且最大的数是:5
两者的区别应该一下就看出来了