IT名企的算法面试题(更新中。。。)

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对关系中存在两个朋友圈),并给出算法的时间复杂度。




思路:采用并查集思想

初始状态
(2,4) {2,4}
(5,7) {2,4} {5,7}
(1,3) {1,3} {2,4} {5,7}
(8,9) {1,3} {2,4} {5,7} {8,9}
(1,2) {1,2,3,4} {5,7} {8,9}
(5,6) {1,2,3,4} {5,6,7} {8,9}
(2,3) {1,2,3,4} {5,6,7} {8,9}
最后我们得到3个 集合{1,2,3,4}, {5,6,7}, {8,9},于是判断两个人是否亲戚的问题就变成判断两个数是否在同一个集合中的问题。如此一来,需要的数据结构就没有图结构那样庞大了。O(n)

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<j但A[i]>A[j]的序偶(A[i],A[j])。知道了逆序这个概念,这道题就简单了,只需要判断数组中的逆序个数即可。代码大概是这样的: int count = 0; for(i=0; i<N; i++) {     for(j=i+1; j<N; j++)     {         if(A[i] > A[j])             count++;     } }


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

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值