5月5日阿里巴巴暑假实习研发试题回忆 个人解题思路

http://blog.csdn.net/tangchao52121/article/details/8887002

1,有一个数组a[1-n],试图找出i,j,k使得a[i]+a[j] = a[k],问最好的算法的算法复杂度是多少?

思路:数组a[1-n]呈离散状态,先对数组排序,用快速排序排序a[1-n],得递增数组b[1-n],其算法时间复杂度为O(nlogn),个人找不出在递增数组中b[i]+b[j] = b[k]有啥规律可循,所以遍历(i,j),其中(1<i<=n,1<j<=n),得b[i]+b[j]=m,而后在递增数组b[1-n]中二分查找m,其算法时间复杂度为O((n^2)*logn)。总体时间复杂度为O(nlogn+(n^2)*logn),即O((n^2)*logn)。不知道还有没有更优算法。


2,有a,b两位同学,来数星星,轮流数,每次数的星星个数在[20,30],最后输完星星的孩子获胜。请问下列哪些星星数能够保证a一定获胜?

思路:此题为博弈题目,设(m,n]为当前剩余星星数,易知当a面对(0,30]则必胜,称(0,30]为必胜态。可以将(,正无穷)区间分为若干互不相交的状态,任一状态(m,n]要么为必胜态,要么为必败态;若(m,n]为必胜态,则对于(m,n]区间存在k使得按规则数k个星星,剩余星星区间(m-k,n-k]为必败态,若(m,n]为必败态,则对于(m,n]区间按规则不管数多少个星星k,剩余星星区间(m-k,n-k]为必胜态。

区间(0,30]为必胜态,则区间(30,50]不管按规则取多少个星星,都会落在区间(0,30]内,则区间(30,50]为必败态,

区间(50,80]必然存在20<=k<=30,使得按规则取k个星星后,会落在区间(30,50]这个必败态内,所以区间(50,80]为必胜态。

容易根据规律推导出区间(i*50,(i+1)*50-20]为必胜态,其中i为自然数,其他的区间为必败态。

则星星数落在必胜态区间,a必胜。


3,有n个士兵,每个士兵知道不同的军事秘密,每两个士兵可以通过一次交流来互相知晓对方掌握的信息,现设计最优的策略来使得通过最少的交流次数使所有士兵知道所有军事秘密,并给出最优策略所需的交流次数。(给出算法思路,计算次数)

思路:使用归并法,设前n/2个士兵组成的集合A互相知晓集合内所有士兵的秘密,不知道其他任意士兵的秘密,后n/2个士兵组成的集合B也只知道自己集合内部的所有秘密。从集合A中取一个士兵a,从集合B中取一个士兵b,让a、b互相交流之后,则a、b知道了所有的军事秘密,经过n/2次上述操作后,算法完成。对于集合A内部的士兵,用同样的方法分为两个小集合进行同样的操作。基本操作和归并排序类似。所以其算法复杂度也与归并排序相同为O(nlogn),士兵交流的次数为nlogn/2不知道还有没有更优算法。


4,有1个明星,n-1个群众,群众之间相互认识 与否的关系是未知的,但是所有群众都认识明星,而明星一个群众也不认识;现在有一个机器人名为robot1,他能自动询问一个人,问他是否认识另外一个人,它每次问一个人与另外一个人是否认识的算法复杂度为o(1),请设计算法通过机器人来找到明星,并给出所设计算法的算法复杂度(只写思路,不写算法复杂度分析不得分)

思路:所有人分为n/2组,每组一般两个人,落单一个人为一组。对每组人a,b利用机器人询问a是否认识b,b是否认识a,

若a,b相互认识或相互不认识,则舍弃a、b,

若a认识b而b不认识a,则舍弃a,

若b认识a而a不认识b,则舍弃b,

落单一人为一组的继续保留。

经过一轮操作后,将保留下来的人继续进行上述操作,直至剩下一人为止,则此人为明星。

每轮操作复杂度为O(m),其中m为总人数,每经过一轮操作过后,最坏情况下会保留m/2+1个人。时间复杂度公式为T(m)=T(m/2+1)+m,所以时间复杂度为O(n)。


5.有n个结点组成的一个环,每个结点相当于一个仓库,每个仓库堆积的货物数量不同,只有相邻的仓库之间的货物才能相互搬运,请设计算法来使所有仓库的库存平衡(要求写出代码)

思路:大体思路,不知道是不是最优,将所有仓库货物数量排序得到货物数量递增数列,并算出货物数量平均值,节点中货物数量高于均值的向低于均值的节点搬运,先向最近的节点搬运,直到货物数量达到均值。
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值