在网上看到一个算法题,不是很难,搜一下也有解决办法,但是一般都是几层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
两者的区别应该一下就看出来了
时间: 2024-10-05 05:05:53