一道阿里電話面試中的演算法題

來源:互聯網
上載者:User

電話面試演算法題一道:找出數組中重複次數最多的元素並列印

 

問題不難,看你能給出更優的方案

 

 

Java代碼
  1. import java.util.HashMap;   
  2. import java.util.Iterator;   
  3. import java.util.Map.Entry;   
  4.   
  5. import commons.algorithm.sort.QuickSort;   
  6.   
  7. /**  
  8.  * 找出數組中重複次數最多的元素並列印  
  9.  *  
  10.  */  
  11. public class Problem_3 {   
  12.        
  13.     //先快速排序後迴圈尋找    O( n*log2(n) + n )   
  14.     public static void find1(int[] arr){   
  15.            
  16.         QuickSort.sort(arr);   
  17.            
  18.            
  19.         int max = arr[0];   
  20.         int pre=1;   
  21.         int now=1;   
  22.            
  23.         for(int i=0;i<(arr.length-1);i++){   
  24.                
  25.             if(arr[i]==arr[i+1])   
  26.                 now++;   
  27.             else {   
  28.                 if(now>=pre){   
  29.                     pre=now;   
  30.                     now=1;   
  31.                     max=arr[i];   
  32.                 }      
  33.             }   
  34.         }   
  35.            
  36.            
  37.            
  38.     }   
  39.        
  40.     //嵌套迴圈尋找   O(n*n)   
  41.     public static void find2(int[] arr){   
  42.            
  43.   
  44.         int pre=0;   
  45.         int max=arr[0];   
  46.            
  47.         for(int i=0;i<arr.length;i++){   
  48.             int now=0;   
  49.             for(int j=0;j<arr.length;j++){   
  50.                    
  51.                 if(arr[i]==arr[j]) {   
  52.                     now++;     
  53.                 }                  
  54.             }   
  55.                
  56.             if(now>=pre){               
  57.                 max=arr[i];   
  58.                 pre=now;               
  59.             }   
  60.                
  61.                        
  62.         }   
  63.            
  64.        
  65.            
  66.     }   
  67.        
  68.     //通過 Hash 方式   
  69.     public static void find3(int[] arr){   
  70.         HashMap<Integer,Integer> hm=new HashMap<Integer, Integer>();   
  71.         for(int i=0;i<arr.length;i++){   
  72.             if(hm.containsKey(arr[i])) {   
  73.                 int count=hm.get(arr[i]);   
  74.                 hm.put(arr[i], ++count);   
  75.                 
  76.             }else{   
  77.                 hm.put(arr[i],1);   
  78.             }   
  79.         }   
  80.            
  81.         Iterator<Entry<Integer, Integer>> it=hm.entrySet().iterator();   
  82.         int pre=0;   
  83.         int max=arr[0];   
  84.         while(it.hasNext()) {   
  85.             Entry<Integer, Integer> en=it.next();   
  86.             int key=en.getKey();   
  87.             int val=en.getValue();   
  88.             if(val>pre){    
  89.                 pre=val;   
  90.                 max=key;   
  91.             }   
  92.                
  93.         }   
  94.            
  95.        
  96.            
  97.     }   
  98.     public static  void main(String args[]){   
  99.   
  100.         //資料量800 重複元素多,尋找時候分別是:  46  3680  195   
  101.         int arr2[]={0,1,2,        .....          
  102.                 ,0,1,2,3,6,7,8,9};   
  103.            
  104.         //資料量800 重複元素少,尋找時間分別是     82  3727  360   
  105.         int arr[]={0,0,0,11,12,13,14,5,6    ......        
  106.                         ,51,52,53,,728,29,730,731,3,794,95,796,797,798,799};   
  107.            
  108.   
  109.            
  110.         long start,end;   
  111.                
  112.         start=System.currentTimeMillis();   
  113.         for(int i=0;i<1000;i++) find1(arr);   
  114.         end=System.currentTimeMillis();   
  115.         System.out.println(end-start);   
  116.            
  117.         start=System.currentTimeMillis();   
  118.         for(int i=0;i<1000;i++) find2(arr);   
  119.         end=System.currentTimeMillis();   
  120.         System.out.println(end-start);   
  121.            
  122.            
  123.         start=System.currentTimeMillis();   
  124.         for(int i=0;i<1000;i++) find3(arr);   
  125.         end=System.currentTimeMillis();   
  126.         System.out.println(end-start);   
  127.            
  128.     }   
  129. }  

轉載自:http://leves.javaeye.com/blog/777508

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.