找出数组中重复次数最多的元素并打印

参看: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             }

 

posted on 2014-04-13 22:18  crane_practice  阅读(1099)  评论(0)    收藏  举报

导航