面试100题-2

本题目转自博客http://zhedahht.blog.163.com/blog/static/25411174201131184017844/

完全出于加强算法能力的单纯目的。

 

完整的题目描述:

某公司有几万名员工,请完成一个时间复杂度是O(n)的算法对该公司员工的年龄做排序,

可以使用O(1)的辅助空间

 

思路:1.从要求的时间复杂度上看应该是稳定排序

      2.员工的年龄一般集中在20-60岁之间分布,可以考虑分段排序再归并,但是不符合O(n)

      3.处理的数据比较大,常见的手段比如位运算,计数数组等

      4.对于辅助空间为O(1)的理解

 

开始的代码:(只写功能实现部分)

  
  
  
  
  1. void SortAge(int employeesum, int *employee) { 
  2.  
  3.      
  4.     int length = 70; 
  5.     int *employee_age_num = new int[length]; 
  6.  
  7.     //First,initialize the array 
  8.  
  9.     for(int i = 0; i< length; i++) 
  10.  
  11.         employee_age_num[i] = 0; 
  12.   
  13.  
  14.     //Scan the employees age information and record it 
  15.  
  16.     for(int i = 0; i < employeesum; i++)  
  17.  
  18.         employee_age_num[employee[i].age - 20]++; 
  19.   
  20.  
  21.     //Sort the employee array by the record information  
  22.  
  23.     int employee_index = 0; 
  24.  
  25.     for(int i = 0 ; i < length; i++) 
  26.  
  27.         for(int j = 0; j < employee_age_num[j]; j++) { 
  28.  
  29.             //.....Swap the employee information including age and other things 
  30.  
  31.             employee_index++;    
  32.  
  33.         } 
  34.  
  35.     delete []emplyee_age; 
  36.  

 

分析:上面的代码写的比较失败,原因在于没有弄清楚题目的意思

      1.对公司员工的 年龄 排序,而不是说对整个员工信息排序,二者在空间上要求不同

        以至于头脑中构建的是员工信息可能是一个结构,需要对整体信息排序。

      2.使用O(1)的辅助空间,开始理解为只能申请一个大小是1的空间,但是O(1)的意思是

        空间大小是常数,不随N的变化而变化,这里的1表示常量,

      3.对参数没有进行异常情况处理,有的变量应该设置为const,代码的健壮性考虑不够。

 

修改后的代码:

这里的employee数组存放的只是员工的年龄。

 

  
  
  
  
  1. bool SortAge(int employeesum, int *employee) { 
  2.      
  3.  
  4.     if(employee == NULL || employeesum <= 0) 
  5.  
  6.         return false
  7.          
  8.  
  9.     const int length = 70; 
  10.  
  11.     int *employee_age_num = new int[length]; 
  12.  
  13.  
  14.     //First,initialize the array 
  15.  
  16.     for(int i = 0; i< length; i++) 
  17.  
  18.         employee_age_num[i] = 0; 
  19.   
  20.  
  21.     //Scan the employees age information and record it 
  22.  
  23.     for(int i = 0; i < employeesum; i++)  
  24.  
  25.         employee_age_num[employee[i] - 20]++; 
  26.  
  27.      
  28.  
  29.     //Sort the employee array by the record information  
  30.  
  31.     int employee_index = 0; 
  32.  
  33.     for(int i = 0 ; i < length; i++) 
  34.  
  35.         for(int j = 0; j < employee_age_num[j]; j++) { 
  36.  
  37.             employee[employee_index] = i; 
  38.  
  39.             employee_index++;    
  40.  
  41.         } 
  42.  
  43.     delete []emplyee_age; 
  44.  
  45.     return true
  46.  

 

扩展:如果是根据员工的年龄,对整个员工的信息进行排序呢?

     (就是将代码中employee[employee_index] = i;这句换成和对应位置的员工信息整体交换,

       但是正如flyinghearts所说,需要N个标志位标记元素是否被访问过,排序也就不稳定了)

总结:1.面试题目要看清楚,不一样的条件限制,解决的方法也是不一样的。

      2.代码应该是先实现功能在逐步优化,但是不要因此就忘了边界条件的检测。

      3.功力还是太浅,急需加强学习。

 

 

 

 

你可能感兴趣的:(算法,面试)