算法(四)

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都为整数



你可能感兴趣的:(Android开发)