参看: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)
在此映射中关联指定值与指定键。如果该映射以前包含了一个该键的映射关系,则旧值被替换。
______________________________________________________________________________________________________________________________
返回指定键所映射的值;如果对于该键来说,此映射不包含任何映射关系,则返回 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.remove、Set.remove、removeAll、retainAll 和 clear 操作可从该映射中移除相应的映射关系。它不支持 add 或 addAll 操作。
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 }