一道面试题

在微博上看到一道题,虽然不难但也想了一段时间,所以就记录下来。

题目描述:

给定int数组,要求在O(n)的时间和O(1)的空间内将其中的奇数排在前面,偶数排在后面并保证相对位置不变。

例如  5 6 8 3 2 4 9 ----〉  5 3 9 6 8 2 4

虽然题目看似简单,但限制比较苛刻,也就是求一个线性时间内稳定的就地二值排序问题。

很遗憾我没法给出我思考的具体过程,这个题目的思路我更像是“灵机一动”想到的,而不是“有计划的一步一步推理”出来的。

假设A代表一个连续的奇数串,B代表一个连续的偶数串,则任何一个数组都可以表示成AB相邻出现的形式。

所以我们的目的就是把一串的ABABAB 变成 AB ,即奇数在前偶数在后。

所以算法就很简单了,假设数组为ABABABAB ,则按以下方法:

ABABABAB互换第一个BA,变成AABBABAB ,合并AA和BB两个串,变成ABABAB,重复这个过程直到串变成AB即可。

接着要寻找O(n)的AB互换的算法,例如A=1357 B=2468 经过变换后应该为2468 1357。 

先将整串就地逆置(首尾互换,次首次尾互换以此类推),然后在将A和B分别逆置即可。

即 13572468--〉86427531--〉2468 1357 ,每个元素变了两次位置,所以是线性时间。


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值