面试题

一道阿里电话面试中的算法题

文章分类:Java编程

 

电话面试算法题一道:找出数组中重复次数最多的元素并打印

 

问题不难,看你能给出更优的方案

 

 

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. }  

你可能感兴趣的:(面试题)