zoukankan      html  css  js  c++  java
  • 找出数组中重复次数最多的元素并打印

    参看:http://www.iteye.com/topic/777508

    得练习怎么用java实现哇,只知道思想是不行滴,知道思想能用C/C++实现也是不行的,因为要应聘的职位是java哇,不会用java写,只能说明对java的数据结构和方法不熟悉。

    这个不用先排序,一个直观的方法是用Hash(用数组实现)

     1     int MAX=100;
     2     int num(int[] a){
     3         if(a==null||a.length==0)
     4             return 0;
     5         int b[]=new int[MAX];
     6         for(int i=0;i<b.length;++i){
     7             b[i]=0;
     8         }
     9         for(int i=0;i<a.length;++i){
    10             b[a[i]]++;
    11         }
    12         int maxCount=0;
    13         int num=0;
    14         for(int i=0;i<b.length;++i){
    15             if(b[i]>maxCount){
    16                 maxCount=b[i];
    17                 num=i;
    18             }
    19             
    20         }
    21         return num;
    22     }

    时间复杂度:O(n).缺点:当原始数组内数教少,且值比较大时浪费空间(这个不是因为hash表造成的,而是因为没有设计好hash函数)

    获得数组元素个数:a.length; 不是a.length();

    注:6-8行是否可以去掉?我试了一下,是可以去掉的:http://wenku.baidu.com/link?url=zWkd8cNkfgrSiszmQmaUmOzw2bqG8goGAYECJULveYajWiAODwv1sgeFuCaquw2y7-6JmMLXjXQZw4uIMsq2ztgDXojMDPvYLsL4W5zXQxW

    HashMap

    put   public V put(K key, V value) 

    在此映射中关联指定值与指定键。如果该映射以前包含了一个该键的映射关系,则旧值被替换。

    ______________________________________________________________________________________________________________________________

    get   public V get(Object key)

    返回指定键所映射的值;如果对于该键来说,此映射不包含任何映射关系,则返回 null

    更确切地讲,如果此映射包含一个满足 (key==null ? k==null : key.equals(k)) 的从 k 键到 v 值的映射关系,则此方法返回 v;否则返回 null。(最多只能有一个这样的映射关系。)

    返回 null 值并不一定 表明该映射不包含该键的映射关系;也可能该映射将该键显示地映射为 null。可使用 containsKey 操作来区分这两种情况。

    ______________________________________________________________________________________________________________________________

    containsKey  public boolean containsKey(Object key)

    如果此映射包含对于指定键的映射关系,则返回 true

    ______________________________________________________________________________________________________________________________

    size  public int size()

    返回此映射中的键-值映射关系数。

    ______________________________________________________________________________________________________________________________

    entrySet  public Set<Map.Entry<K,V>> entrySet()

    返回此映射所包含的映射关系的 Set 视图。 该 set 受映射支持,所以对映射的更改将反映在此 set 中,反之亦然。如果在对 set 进行迭代的同时修改了映射(通过迭代器自己的 remove 操作,或者通过在该迭代器返回的映射项上执行 setValue 操作除外),则迭代结果是不确定的。该 set 支持元素的移除,通过 Iterator.removeSet.removeremoveAllretainAllclear 操作可从该映射中移除相应的映射关系。它不支持 addaddAll 操作。

     1     int num(int[] a){
     2         Map<Integer,Integer> map=new HashMap<Integer,Integer>();
     3         for(int i=0;i<a.length;++i){
     4             if(map.containsKey(a[i])){            //如果存在相同的key值
     5                 map.put(a[i], map.get(a[i])+1); //map的put方法会新值代替旧值的
     6             }else{
     7                 map.put(a[i], 1);
     8             }
     9         }
    10         //遍历map
    11         Set<Entry<Integer,Integer>> set = map.entrySet();
    12         Iterator<Entry<Integer,Integer>> iter = set.iterator();
    13         int maxCount=0;
    14         int num=0;
    15         while(iter.hasNext()){
    16             Entry<Integer,Integer> entry = iter.next();
    17             if(entry.getValue()>maxCount){
    18                 maxCount=entry.getValue();
    19                 num=entry.getKey();
    20             }
    21         }
    22         return num;
    23     }

    这个比用数组实现好多了,复杂度也是O(n) ,嘿嘿

    4-8行改为下面的代码比较好

    1             if(!map.containsKey(a[i])){            
    2                 map.put(a[i], 1);
    3             }else{
    4                 map.put(a[i], map.get(a[i])+1); 
    5             }
  • 相关阅读:
    dubbo学习(一)认识
    MySQL学习(九)小结
    MySQL学习(八)删除表数据
    MySQL学习(六)change-buffer
    RPC 学习(一)认识
    MySQL学习(五)事务隔离
    MySQL学习(四)死锁及死锁检测
    计算机操作系统 --- 进程和进程的上下文切换
    MySQL 学习(三)事务学习
    消息队列(七)--- RocketMQ延时发送和消息重试(半原创)
  • 原文地址:https://www.cnblogs.com/crane-practice/p/3662709.html
Copyright © 2011-2022 走看看