電話面試演算法題一道:找出數組中重複次數最多的元素並列印
問題不難,看你能給出更優的方案
Java代碼
- import java.util.HashMap;
- import java.util.Iterator;
- import java.util.Map.Entry;
-
- import commons.algorithm.sort.QuickSort;
-
- /**
- * 找出數組中重複次數最多的元素並列印
- *
- */
- public class Problem_3 {
-
- //先快速排序後迴圈尋找 O( n*log2(n) + n )
- public static void find1(int[] arr){
-
- QuickSort.sort(arr);
-
-
- int max = arr[0];
- int pre=1;
- int now=1;
-
- for(int i=0;i<(arr.length-1);i++){
-
- if(arr[i]==arr[i+1])
- now++;
- else {
- if(now>=pre){
- pre=now;
- now=1;
- max=arr[i];
- }
- }
- }
-
-
-
- }
-
- //嵌套迴圈尋找 O(n*n)
- public static void find2(int[] arr){
-
-
- int pre=0;
- int max=arr[0];
-
- for(int i=0;i<arr.length;i++){
- int now=0;
- for(int j=0;j<arr.length;j++){
-
- if(arr[i]==arr[j]) {
- now++;
- }
- }
-
- if(now>=pre){
- max=arr[i];
- pre=now;
- }
-
-
- }
-
-
-
- }
-
- //通過 Hash 方式
- public static void find3(int[] arr){
- HashMap<Integer,Integer> hm=new HashMap<Integer, Integer>();
- for(int i=0;i<arr.length;i++){
- if(hm.containsKey(arr[i])) {
- int count=hm.get(arr[i]);
- hm.put(arr[i], ++count);
-
- }else{
- hm.put(arr[i],1);
- }
- }
-
- Iterator<Entry<Integer, Integer>> it=hm.entrySet().iterator();
- int pre=0;
- int max=arr[0];
- while(it.hasNext()) {
- Entry<Integer, Integer> en=it.next();
- int key=en.getKey();
- int val=en.getValue();
- if(val>pre){
- pre=val;
- max=key;
- }
-
- }
-
-
-
- }
- public static void main(String args[]){
-
- //資料量800 重複元素多,尋找時候分別是: 46 3680 195
- int arr2[]={0,1,2, .....
- ,0,1,2,3,6,7,8,9};
-
- //資料量800 重複元素少,尋找時間分別是 82 3727 360
- int arr[]={0,0,0,11,12,13,14,5,6 ......
- ,51,52,53,,728,29,730,731,3,794,95,796,797,798,799};
-
-
-
- long start,end;
-
- start=System.currentTimeMillis();
- for(int i=0;i<1000;i++) find1(arr);
- end=System.currentTimeMillis();
- System.out.println(end-start);
-
- start=System.currentTimeMillis();
- for(int i=0;i<1000;i++) find2(arr);
- end=System.currentTimeMillis();
- System.out.println(end-start);
-
-
- start=System.currentTimeMillis();
- for(int i=0;i<1000;i++) find3(arr);
- end=System.currentTimeMillis();
- System.out.println(end-start);
-
- }
- }
轉載自:http://leves.javaeye.com/blog/777508