1、(淘宝)假设淘宝一天有5亿条成交数据,求出销量最高的100个商品并给出算法的时间复杂度?
思想1:将所有的记录分开成若干个小部分,对于每个小部分选出100个最高的商品,然后两两归并,取前100个。
2、数字三角形,从顶部出发,在每一结点可以选择向左走或得向右走,一直走到底层,要求找出一条路径,使路径上的值的和最大。给出算法的时间复杂度。
如下图例子,数字三角形层数n(1<=n<=100)
思路:DP问题,最大值一定是比较从顶部到底层每个点的路径最大值的最大值。 那怎么找从顶点(1,1)到(i,j)的最大值呢? 下面我用A[i][j]表示这个最大值。 很明显每一行最左元素跟最右元素知道A值,因为从顶点开始只有一个路径。 对于中间的点(i,j)来说,可以这样求解: A[i][j]=a[i][j]+max(A[i-1][j],A[i-1][j-1]),也就是说利用了只能从左边或者右边到达(i,j)点这个信息
3.给出10W条人和人之间的朋友关系,求出这些朋友关系中有多少个朋友圈(如A-B、B-C、D-E、E-F,这4对关系中存在两个朋友圈),并给出算法的时间复杂度。
思路:采用并查集思想
4.(蘑菇街2017)现有一个n个整数的序列,你要做的就是交换两个数的位置直到整个序列按照升序排列,那么将这个整数序列排好序,需要交换多少次?例如,1,2,3,5,4,我们只需要交换一次,即将5和4交换即可。
输入描述:
第一行输入一个正整数n(n≤1000),表示数字序列的元素个数,占一行;接下来一行输入从1到n的n个整数排序,中间用空格隔开
输出描述:
输出序列升序排列需要的最少交换次数
输入例子:
4
4 3 2 1
输出例子:
6
思想:
学过线性代数的人都知道,刚开始讲行列式的时候有个逆序数的概念,所以此题考的就是逆序数,概念就是一个序列中当前数比它前面的序列数大的个数,比如12354,对1来说,1前面比1大的没有,为0,2为0,3为0,5为0,4为1,因为5比4大,所以这些求和就行了,这个题其实在考“逆序”,逆序是指数组中具有i
5.(京东2017)
有一个有序表为{1,5,8,11,19,22,31,35,40,45,48,49,50},当二分查找值为48的结点时, 查找成功需要比较的次数( B)
A. 4
B. 3
C. 2
D. 1
6.(今日头条2017)
栈是先进后出的数据结构,给定一个大小为3的初始状态为空的栈,已知一组数据经过这个栈后,最终的数据顺序依次为:1 3 2 4 问原始进栈的数据不可能是以下的哪组?
A. 2、3、1、4
B. 3、1、2、4
C. 4、2、3、1
D. 1、4、3、2
思想: 答案是C A:进进进出出出进出 B:进进出出进出进出 C:进进进进出出出出 D:进出进进出进出出 迷惑点有二,一是D选项乍一看成不了,其实D也可以,第二个迷惑点是栈的大小是3,C选项要成的话空间不够。所以这题很容易选成D