某国企算法题

  与数组有关的算法题有很多,今天分享一道某国企招聘时的一道算法题.题目实际上不难,题目如下:

用面向对象的方法求出数组中重复 value 的个数,按如下个数输出:
1 出现:1 次 3 出现:2 次 2 出现:4 次
int[] arr = {1,4,1,4,2,5,4,5,8,7,8,77,88,5,4,9,6,2,4,1,5};

我相信很多码友刚看到此题时心中就有了一万种代码思路,因为在一个给定的容器中找出重复的元素这类算法基本上见到的比较多了.首先我们可以定义一个变量来记录当前元素
重复的次数,如果这个出现了那就把这个变量做加一操作.然后我们就可以进行取元素然后和容器中的数据依次进行比较了.但这里会出现一个问题,那就是如果一个元素比较过了
并且已经进行出现次数的记录了,如果后面再次出现我们还要进行取出这个元素再次比较一次.比喻说一这个元素,第一个元素就是一,我们依次进行比较后.将会往后面继续进行
取元素,比较的操作,那么每一个一这个元素都要一一进行比较,因此会做很多无用的操作.有的码友肯定会说如果确定这个元素重复了,那就可以把这个元素进行删除操作.因为这
不影响后面的比较,但这是数组操作,不像删除和增加操作显得那么容易.因此我们可以在比较的时候不进行优化,但在比较完之后我们可以用一个容器进行去重操作.也就是说在
比较的时候会出现多次1出现:1次这样的语句,我们可以对这样的元素再次使用一个去重的容器.对这就是set集合,自带去重光环.详细代码如下:
 1 import java.util.HashSet;
 2 import java.util.Set;
 3 
 4 
 5 public class Array {
 6     public static void main(String[] args) {
 7         int[] arr = {1,4,1,4,2,5,4,5,8,7,8,77,88,5,4,9,6,2,4,1,5};
 8         //定义一个集合来存储数据
 9         Set<String> set = new HashSet<>();
10         //定义一个用来记录语句的变量
11         String s = null;
12         //定义一个用来记录出现次数的变量
13         int a=0;
14         for (int i = 0; i < arr.length; i++) {
15             for (int j = 0; j < arr.length; j++) {
16                 //取出元素后和容器里进行比较
17                 if(arr[i]==arr[j]){
18                     //如果数据相等说明该数据出现了,因此要加一
19                     a++;
20                 }
21             }
22             s=arr[i]+"出现:"+a;
23             //放到去重集合set中
24             set.add(s);
25             //将记录语句的变量置空
26             s=null;
27             //记录次数的变量变为0,方便后面继续使用
28             a=0;
29         }
30         //输出集合数据
31         System.out.println(set);
32     }
33 }

 

posted @ 2021-04-17 15:35  诸葛孔俺  阅读(229)  评论(0)    收藏  举报