好久没更新博客了,写博客分享是个好习惯,发现坚持是比较难得的一件事情。
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版权协议,转载请附上原文出处链接和本声明。