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,快速排序的过程、时间复杂度、空间复杂度
答:
基本思想:(分治)
- 先从数列中取出一个数作为key值;
- 将比这个数小的数全部放在它的左边,大于或等于它的数全部放在它的右边;
- 对左右两个小数列重复第二步,直至各区间只有1个数。
辅助理解:挖坑填数
- 初始时 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
- 初始时 i = 0; j = 9; key=72
平均时间复杂度:O(N*logN)
6,手写堆排序
答:
//构建最小堆 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都为整数