算法(四)

1,排序算法有哪些?

答:冒泡排序,选择排序,插入排序,希尔排序,快速排序,归并排序,堆排序,基数排序

2,最快的排序算法是哪个?

3,手写一个冒泡排序

答:

public static void BubbleSort(int [] arr){

     int temp;//临时变量
     for(int i=0; i<arr.length-1; i++){   //表示趟数,一共arr.length-1次。
         for(int j=arr.length-1; j>i; j--){

             if(arr[j] < arr[j-1]){
                 temp = arr[j];
                 arr[j] = arr[j-1];
                 arr[j-1] = temp;
             }
         }
     }
 }

4,手写快速排序代码

答:

public static void quickSort(int a[],int l,int r){
     if(l>=r)
       return;

     int i = l; int j = r; int key = a[l];//选择第一个数为key

     while(i<j){

         while(i<j && a[j]>=key)//从右向左找第一个小于key的值
             j--;
         if(i<j){
             a[i] = a[j];
             i++;
         }

         while(i<j && a[i]<key)//从左向右找第一个大于key的值
             i++;

         if(i<j){
             a[j] = a[i];
             j--;
         }
     }
     //i == j
     a[i] = key;
     quickSort(a, l, i-1);//递归调用
     quickSort(a, i+1, r);//递归调用
 }

5,快速排序的过程、时间复杂度、空间复杂度

答:

  1. 基本思想:(分治)

    • 先从数列中取出一个数作为key值;
    • 将比这个数小的数全部放在它的左边,大于或等于它的数全部放在它的右边;
    • 对左右两个小数列重复第二步,直至各区间只有1个数。
  2. 辅助理解:挖坑填数

    • 初始时 i = 0; j = 9; key=72
      由于已经将a[0]中的数保存到key中,可以理解成在数组a[0]上挖了个坑,可以将其它数据填充到这来。
      从j开始向前找一个比key小的数。当j=8,符合条件,a[0] = a[8] ; i++ ; 将a[8]挖出再填到上一个坑a[0]中。
      这样一个坑a[0]就被搞定了,但又形成了一个新坑a[8],这怎么办了?简单,再找数字来填a[8]这个坑。
      这次从i开始向后找一个大于key的数,当i=3,符合条件,a[8] = a[3] ; j-- ; 将a[3]挖出再填到上一个坑中。
      数组:72 - 6 - 57 - 88 - 60 - 42 - 83 - 73 - 48 - 85
       0   1   2    3    4    5    6    7    8    9
    • 此时 i = 3; j = 7; key=72
      再重复上面的步骤,先从后向前找,再从前向后找。
      从j开始向前找,当j=5,符合条件,将a[5]挖出填到上一个坑中,a[3] = a[5]; i++;
      从i开始向后找,当i=5时,由于i==j退出。
      此时,i = j = 5,而a[5]刚好又是上次挖的坑,因此将key填入a[5]。
      数组:48 - 6 - 57 - 88 - 60 - 42 - 83 - 73 - 88 - 85
       0   1   2    3    4    5    6    7    8    9
    • 可以看出a[5]前面的数字都小于它,a[5]后面的数字都大于它。因此再对a[0…4]和a[6…9]这二个子区间重复上述步骤就可以了。
      <数组:48 - 6 - 57 - 42 - 60 - 72 - 83 - 73 - 88 - 85
       0   1   2    3    4    5    6    7    8    9
  3. 平均时间复杂度:O(N*logN)

6,手写堆排序

答:

  1. //构建最小堆
    public static void MakeMinHeap(int a[], int n){
     for(int i=(n-1)/2 ; i>=0 ; i--){
         MinHeapFixdown(a,i,n);
     }
    }
    //从i节点开始调整,n为节点总数 从0开始计算 i节点的子节点为 2*i+1, 2*i+2  
    public static void MinHeapFixdown(int a[],int i,int n){
    
       int j = 2*i+1; //子节点
       int temp = 0;
    
       while(j<n){
           //在左右子节点中寻找最小的
           if(j+1<n && a[j+1]<a[j]){   
               j++;
           }
    
           if(a[i] <= a[j])
               break;
    
           //较大节点下移
           temp = a[i];
           a[i] = a[j];
           a[j] = temp;
    
           i = j;
           j = 2*i+1;
       }
    }
    public static void MinHeap_Sort(int a[],int n){
      int temp = 0;
      MakeMinHeap(a,n);
    
      for(int i=n-1;i>0;i--){
          temp = a[0];
          a[0] = a[i];
          a[i] = temp; 
          MinHeapFixdown(a,0,i);
      }     
    }

7,堆排序过程、时间复杂度及空间复杂度

8,写出你所知道的排序算法及时空复杂度,稳定性

9,二叉树给出根节点和目标节点,找出从根节点到目标节点的路径

10,给阿里2万多名员工按年龄排序应该选择哪个算法?

11,GC算法(各种算法的优缺点以及应用场景)

12,蚁群算法与蒙特卡洛算法

13,子串包含问题(KMP算法)写代码实现

14,一个无序,不重复数组,输出N个元素,使得N个元素的和相加为M,给出时间复杂度、空间复杂度。手写算法

15,万亿级别的两个URL文件A和B,如何求出A和B的差集C(提示:Bit映射->hash分组->多文件读写效率->磁盘寻址以及应用层面对寻址的优化)

16,百度POI中如何试下查找最近的商家功能(提示:坐标镜像+R树)。

17,两个不重复的数组集合中,求共同的元素。

18,两个不重复的数组集合中,这两个集合都是海量数据,内存中放不下,怎么求共同的元素?

19,一个文件中有100万个整数,由空格分开,在程序中判断用户输入的整数是否在此文件中。说出最优的方法

20,一张Bitmap所占内存以及内存占用的计算

21,2000万个整数,找出第五十大的数字?

22,烧一根不均匀的绳,从头烧到尾总共需要1个小时。现在有若干条材质相同的绳子,问如何用烧绳的方法来计时一个小时十五分钟呢?

答:用一根绳子2头点燃,同时另取一根绳子点燃
当第一根绳子燃烧完,即为半小时,这时第二根绳子的另一头点燃,并开始计时.
则从计时开始到第二根绳子燃烧完用时十五分钟.
再取一根绳子点燃,直至这根绳子燃烧完,计时结束.
则总计时开始的那刻开始到计时结束,用时1小时15分钟,可以此来计时.

23,求1000以内的水仙花数以及40亿以内的水仙花数

24,5枚硬币,2正3反如何划分为两堆,然后通过翻转让两堆中正面向上的硬币和反面向上的硬币个数相同

25,时钟走一圈,时钟分钟重合几次

答:时钟与分钟一天只重合22次

26,N*N的方格纸,里面有多少个正方形

答:

解法:n=1,时候有1个,

n=2,有4+1=2^2+1=5个(4个小的一个大的)

有 9+4+1 = 3^2 + 2^2 +1 = 13个(有9个小的,4个中的,各一个大的)

n=3,有9+4+1=3^2+2^2+1=14个(9个小的,4个中的,一个大的)

包含有n^2+(n-1)^2+......+1=(n+1)(2n+1)n/6 个

27,x个苹果,一天只能吃一个、两个、或者三个,问多少天可以吃完?

答:1,全部是一天只吃一个,最多可以吃x天;

2,每天都吃2个的话,最多可以吃x/2天;

2,每天都吃3个的,最多可以吃x/3天;

设每天吃一个的有m天,每天吃2个的有y天,每天吃3个的有z天

则:m+2y+3z=x;m,z,y都为整数



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
个人觉得是我见过的最简单易懂的算法入门书籍。 以前搜刮过几本算法竞赛书,但是难度终归太大【好吧,其实是自己太懒了】。 略翻过教材,大多数水校的教材,大家懂的。好一点的也是那本国内的经典,不是说它写的不好,只是没有这一本好。 本书Java实现,配有大量的图解,没有一句难懂的话,而且全都是模块化实现。 讲的都是实用算法,没有那些高大上听着名字就让人感到很害怕的东西,个人觉得比CLRS实用性要强,更加适合入门的学习。 大一,推荐这本书入门 【有C语言基础即可,自己去搜索下如何用Java写出Hello World就没有问题】 大二,推荐这本书从头到尾好好读一遍,做下上千道的课后习题 【后面的有点小难度,但是难度不大值得一做,听起来很多的样子,用心去做,相信很快就可以做完的】。 大三,推荐这本书,重新温习已知算法,为找工作,考研做准备。 【可以试着自己在纸上全部实现一遍】 大,依旧推荐这本书,没事重温经典,当手册来查也不错。 Sedgwick 红黑树的发现者,Donald E.Knuth 的得意门生,对各种算法都有比较深入的研究,他的书,我想不会太差。 也许对于数据结构的学习涉及的内容比较少,没有动态规划,图论也只是讲了很基础的东西,字符串KMP弄的过于复杂(对比于acm)。但是瑕不掩瑜,对于绝大部分内容真的讲的超级清楚,完美的图解,就像单步调试一样,也许是一本不需要智商就能看懂的算法书(习题应该略有难度,还没有做,打算上Princeton的公开课时同步跟进)。至少这是一本让我这个算法渣渣看了爱不释手,怦然心动的书。 完美学习资源: 官方主页:http://algs4.cs.princeton.edu/home/ Coursera公开课:https://www.coursera.org/course/algs4partI (听说已经开课两期了,最近即将开课的时间是2014/09/05号那期,希望有兴趣的同学一起来学习)。 MOOC平台(笔记、讨论等): http://mooc.guokr.com/course/404/Algorithms--Part-I/ http://mooc.guokr.com/course/403/Algorithms--Part-II/ 不得不吐槽,他的lecture比他的书好,他本人讲的课更是一绝。 互补课程: 斯福坦的Algorithms: Design and Analysis, http://mooc.guokr.com/course/157/Algorithms--Design-and-Analysis--Part-1/ 快毕业了才接触到豆瓣和MOOC,看到很多经典的书籍都是推荐大学一二年级的学生看,每每想到自己却连书皮都没有摸过,就深感惭愧。 我们都老的太快,却聪明得太迟。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值