复试常见算法
1、给定随机100位数,求中位数?
(1)构造一维数组,并从小到大排序,若为偶数100,取中间的两位数的平均数,若为奇数101,则直接取中间的元素
(2)numpy.median()
2、s的n次方求解有哪几种方法?
(1)递归方法:在求一个数s的n次幂时,可分为奇数和偶数两种情况
若为奇数:x^n=x^(n-1)/2 * x^(n-1)/2 * x
若为偶数:x^n=x^n/2 * x^n/2
若n==0,则任何数的0次幂等于1
若n==1,则任何数的1次幂等于本身
(2)非递归方法:将n次幂转换为二进制的形式
(3)直接调用库函数pow
3、给一组数据排序,说出三种取前十个数?
(1)假设排序是从大到小排序,即取出前十个数是序列中最大的10个(Topk问题),将输入的内容进行完全拍讯,从中直接选择出前K个元素,例如快排logn
(2)对数据进行部分排序,即只对前K大的元素进行排序,此时我们选择冒泡排序或选择排序进行处理,即每次冒泡都得到一个所求元素okn
(3)对数据不进行排序,这种策略将会有更加好的性能开销。例如利用快排的分割函数位置K,则其前面的内容即为所求。时间复杂度O(n)(要全部加载到内存);还可以维护大小为K的小根堆,目前该小根堆中的元素时排名前K的数(不需要全部加载到内存)
4、合并k个有序数组(假设升序)
(1)将k个数组的第一个元素取出,维护一个小顶堆
(2)堆顶元素并存在结果数组中,并把该元素所在数组的下一个下一个元素取出来压入队列
(3)调整堆的结构,使其满足小顶堆的定义
(4)重复23步骤知道合并完成
5、合并两个无序链表称为一个有序链表,只能用常数空间:归并的思想,用快慢指针不断二分链表
6、二维数组的查找:行和列都有序时,每次都把要查找的元素和当前剩下的二维数组的右上角数字比较,不对就删除一行或一列
topk问题: