几道算法题--记下

一. 海量数据求中位数,比如10G的int64的数,求排序后最中间的数

首先,若能全部放入内存中,那么可以使用类似快排的算法,每次保留包含中位数的那段数据,直到找到中位数;那么海量数据显然无法一次性放入内存,如何每次减少数据呢?一个自然的思路就是分成若干段(大小能放入内存中),也使用之前的算法,但是该舍弃哪一段显然要在整体上来判断;我的思路是引入一个基准数X,所有的段都使用X进行partition,那么就能知道全部数据中小于X的和大于X的数据量,也即知道了该保留哪些数据;重复该过程,当数据量能读到内存时就OK了。


二. 一个乱序数组求两两之差绝对值最小的值

最简单的算法就是排序然后相邻的数做差记录绝对值最小的,可以接受;

更巧妙的方法还是利用快排,与基准数X比较时就记录下最小的差绝对值,分成两半后,两段只需要在各自的段求最小值,不会跨过X,最后比较下每次产生的最小值即可。


三. 字符串替换算法

给定一个字符串 str ,要求将其中的‘m’全都替换成‘abc’,如何尽量优化空间和时间复杂度?

如果每次只考虑其中一个‘m’并进行替换移位,显然移位操作代价太大;很容易的想到要从全局出发,使得移位能够一步到位。

具体就是首先遍历求出‘m’的个数,计算出所需的额外空间,然后从后往前进行移位和替换。


四. 给你一个数组 A [ 1 .. n ] ,请你在 O ( n ) 的时间里构造一个新的数组 B [ 1 .. n ] ,使得 B [ i ] = A [ 1 ] * A [ 2 ] * ... * A [ n ]/A [ i ] 。你不能使用除法运算。

比较容易的想到记录中间结果,任意一个 B[i] 都可以看成是两个序列的成绩,一个是A[1..i-1],另一个是A[i+1..n],因此可以先求出 A[1..k],k=1..n-1;以及 A[k..n],k=2..n-1 ;分别消耗O(n)的时间,最后组合起来就构造出B,同样花费O(n)。总时间也是O(n)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值