一题多解——求数组中每个元素出现的次数

好久没更新博客了,写博客分享是个好习惯,发现坚持是比较难得的一件事情。

2021年第一更,就写一篇比较简单常用的算法入门题吧,主要是利用程序算法思想,求数组中每个元素出现的次数。

先看一下需求描述:

现在有一列数组:
    a[0] , a[1] , a[2] , ...... a[n-1]
求这列数组中每个元素出现的次数
打印格式: {a[0]=次数,a[1]=次数,......a[m]=次数}
打印说明:打印结果中,a[m]不重复打印,a[m]可以不按照数组顺序

拿到这样一道题,我们脑海中可能想到很多种方式来解决这个问题,看一下以下总结的两种经典做法吧。

1、纯数组方式

/**
	 * 用数组的方式,求数组中每个元素出现的次数
	 * @param arr
	 */
	public void ArrNumOfEveryone(int arr[]) {
		int b[] = new int[100]; //用于存放数组中每个元素出现的次数,对应关系arr[i]->b[i]
		for(int i = 0 ;i<=arr.length-1;i++)
			for(int j=0 ; j<=arr.length-1;j++) {
				if(arr[i]==arr[j]) {
					b[i]++;
				}
			}
		
		//打印第一个元素及其出现的次数
		System.out.print("{"+arr[0]+"="+b[0]);
		boolean flag = false; //去重标志,元素相同不重复打印
        //这里采用数组内部比较法,不用hashset容器
		for(int x = 1 ;x<=arr.length - 1 ; x++) {
			for(int y = 0 ;y<=x - 1 ;y++) {
				if(arr[x]==arr[y])	flag = true;
			}
			if(flag == true) {
				flag = false; //重新初始化标志
				continue; //元素相同不重复打印
			}
			System.out.print(" ," + arr[x] +"=" + b[x]);
		}
		System.out.println("}");	
	}

以上的做法是用纯数组的思想,用另外一个数组来记录原来数组的元素出现的个数,通过循环遍历和比较去重,打印出满足需求的结果。这段程序在可读性方面比较一般,而且出现两次嵌套循环,效率比较低下。下面第二种方式,借助于Java util中的集合容器类,更加高效地改进了程序,而且代码简洁,效率高,可读性强。

2、容器方式

/**
	 * 用容器的方式,求数组中每个元素出现的次数
	 * @param arr
	 */
	public void hashNumOfEveryone(int arr[]) {
		//构建一个hashmap,key为数组元素,value为元素对应的个数
		Map<Integer,Integer> map = new HashMap<Integer,Integer>();
		for(int i = 0;i<=arr.length-1;i++) {
			//arr[i]不存在hashmap的key中,将其作为key存入map中,value初始化为1
			if(!map.containsKey(arr[i])) {
				map.put(arr[i], 1);
			}
			//arr[i]存在hashmap的key中,将其作为key存入map中,原有的value+1,这里key值相同会覆盖原有的键值对
			else {
				map.put(arr[i], map.get(arr[i])+1);
			}		
		}
		//打印
		System.out.print(map);
	}

Java的util包为开发者提供了大量便于开发和使用的工具类,集合容器就是最常用的。希望通过这篇文章,能提醒到读者朋友们有空记得复习Java基础源码。

水文简单,大神略过~

 


版权声明:本文为jsyuger原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。