您的位置:首页 > 职场人生

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

2012-04-15 23:06 85 查看

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

 

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

 

 

Java代码 
  1. importjava.util.HashMap;
  2. importjava.util.Iterator;
  3. importjava.util.Map.Entry;
  4. importcommons.algorithm.sort.QuickSort;
  5. /**
  6. *找出数组中重复次数最多的元素并打印
  7. *
  8. */
  9. publicclassProblem_3{
  10. //先快速排序后循环查找O(n*log2(n)+n)
  11. publicstaticvoidfind1(int[]arr){
  12. QuickSort.sort(arr);
  13. intmax=arr[0];
  14. intpre=1;
  15. intnow=1;
  16. for(inti=0;i<(arr.length-1);i++){
  17. if(arr[i]==arr[i+1])
  18. now++;
  19. else{
  20. if(now>=pre){
  21. pre=now;
  22. now=1;
  23. max=arr[i];
  24. }
  25. }
  26. }
  27. }
  28. //嵌套循环查找O(n*n)
  29. publicstaticvoidfind2(int[]arr){
  30. intpre=0;
  31. intmax=arr[0];
  32. for(inti=0;i<arr.length;i++){
  33. intnow=0;
  34. for(intj=0;j<arr.length;j++){
  35. if(arr[i]==arr[j]){
  36. now++;
  37. }
  38. }
  39. if(now>=pre){
  40. max=arr[i];
  41. pre=now;
  42. }
  43. }
  44. }
  45. //通过Hash方式
  46. publicstaticvoidfind3(int[]arr){
  47. HashMap<Integer,Integer>hm=newHashMap<Integer,Integer>();
  48. for(inti=0;i<arr.length;i++){
  49. if(hm.containsKey(arr[i])){
  50. intcount=hm.get(arr[i]);
  51. hm.put(arr[i],++count);
  52. }else{
  53. hm.put(arr[i],1);
  54. }
  55. }
  56. Iterator<Entry<Integer,Integer>>it=hm.entrySet().iterator();
  57. intpre=0;
  58. intmax=arr[0];
  59. while(it.hasNext()){
  60. Entry<Integer,Integer>en=it.next();
  61. intkey=en.getKey();
  62. intval=en.getValue();
  63. if(val>pre){
  64. pre=val;
  65. max=key;
  66. }
  67. }
  68. }
  69. publicstaticvoidmain(Stringargs[]){
  70. //数据量800重复元素多,查找时候分别是:463680195
  71. intarr2[]={0,1,2,.....
  72. ,0,1,2,3,6,7,8,9};
  73. //数据量800重复元素少,查找时间分别是823727360
  74. intarr[]={0,0,0,11,12,13,14,5,6......
  75. ,51,52,53,,728,29,730,731,3,794,95,796,797,798,799};
  76. longstart,end;
  77. start=System.currentTimeMillis();
  78. for(inti=0;i<1000;i++)find1(arr);
  79. end=System.currentTimeMillis();
  80. System.out.println(end-start);
  81. start=System.currentTimeMillis();
  82. for(inti=0;i<1000;i++)find2(arr);
  83. end=System.currentTimeMillis();
  84. System.out.println(end-start);
  85. start=System.currentTimeMillis();
  86. for(inti=0;i<1000;i++)find3(arr);
  87. end=System.currentTimeMillis();
  88. System.out.println(end-start);
  89. }
  90. }
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: