面试题

系统 1609 0

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

文章分类: Java编程

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

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

Java代码
  1. import java.util.HashMap;
  2. import java.util.Iterator;
  3. import java.util.Map.Entry;
  4. import commons.algorithm.sort.QuickSort;
  5. /**
  6. *找出数组中重复次数最多的元素并打印
  7. *
  8. */
  9. public class Problem_3{
  10. //先快速排序后循环查找O(n*log2(n)+n)
  11. public static void find1( int []arr){
  12. QuickSort.sort(arr);
  13. int max=arr[ 0 ];
  14. int pre= 1 ;
  15. int now= 1 ;
  16. for ( int i= 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. public static void find2( int []arr){
  30. int pre= 0 ;
  31. int max=arr[ 0 ];
  32. for ( int i= 0 ;i<arr.length;i++){
  33. int now= 0 ;
  34. for ( int j= 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. public static void find3( int []arr){
  47. HashMap<Integer,Integer>hm= new HashMap<Integer,Integer>();
  48. for ( int i= 0 ;i<arr.length;i++){
  49. if (hm.containsKey(arr[i])){
  50. int count=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. int pre= 0 ;
  58. int max=arr[ 0 ];
  59. while (it.hasNext()){
  60. Entry<Integer,Integer>en=it.next();
  61. int key=en.getKey();
  62. int val=en.getValue();
  63. if (val>pre){
  64. pre=val;
  65. max=key;
  66. }
  67. }
  68. }
  69. public static void main(Stringargs[]){
  70. //数据量800重复元素多,查找时候分别是:463680195
  71. int arr2[]={ 0 , 1 , 2 ,.....
  72. , 0 , 1 , 2 , 3 , 6 , 7 , 8 , 9 };
  73. //数据量800重复元素少,查找时间分别是823727360
  74. int arr[]={ 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. long start,end;
  77. start=System.currentTimeMillis();
  78. for ( int i= 0 ;i< 1000 ;i++)find1(arr);
  79. end=System.currentTimeMillis();
  80. System.out.println(end-start);
  81. start=System.currentTimeMillis();
  82. for ( int i= 0 ;i< 1000 ;i++)find2(arr);
  83. end=System.currentTimeMillis();
  84. System.out.println(end-start);
  85. start=System.currentTimeMillis();
  86. for ( int i= 0 ;i< 1000 ;i++)find3(arr);
  87. end=System.currentTimeMillis();
  88. System.out.println(end-start);
  89. }
  90. }

面试题


更多文章、技术交流、商务合作、联系博主

微信扫码或搜索:z360901061

微信扫一扫加我为好友

QQ号联系: 360901061

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描下面二维码支持博主2元、5元、10元、20元等您想捐的金额吧,狠狠点击下面给点支持吧,站长非常感激您!手机微信长按不能支付解决办法:请将微信支付二维码保存到相册,切换到微信,然后点击微信右上角扫一扫功能,选择支付二维码完成支付。

【本文对您有帮助就好】

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描上面二维码支持博主2元、5元、10元、自定义金额等您想捐的金额吧,站长会非常 感谢您的哦!!!

发表我的评论
最新评论 总共0条评论