lhl 2010年06月23日
面试题中的杂耍算法
题目:给定整数数组,元素为a1 a2 a3 .. an b1 b2 b3 .. bn元素个数为 2n
要求:请生成如下数组,a1 b1, a2 b2, a3 b3, .. an bn.
条件:时间复杂度为O(N),空间复杂度为O(1) <无任何提示条件下:2小时内完成>

解答思路如下:<伪代码>
void fun(const int array[], const int size)
{
int start = 1;
int pos = 1;
int count = 0;//O(N): N-2
int temp; //O(1)就是这里
while(count < size-2)
{
while(start对应值所在新位置的值 != pos对应值所在新位置的值) //有点拗口 呵呵自己去计算吧 很简单的
{
temp = pos对应值所在新位置的值;
array[pos对应值所在新位置] = array[pos];
count ++;
}
start += 2;
pos = start;
}
}


实例演示:
old: 01 02 03 04 05 06 07 08 11 12 13 14 15 16 17 18
new: 01 11 02 12 03 13 04 14 05 15 06 16 07 17 08 18

按照上述算法的生成过程如下:
start = 1 count = 4
11 02 04 03 06 07 08 05 12 13 14 15 16 17
start = 3 count = 4 + 4
11 02 12 03 06 04 08 05 15 13 14 07 16 17
start = 5 count = 4 + 4 + 2
11 02 12 03 13 04 08 05 15 06 14 07 16 17
start = 7 count = 4 + 4 + 2 + 4 = 14 == 16-2 //complete
11 02 12 03 13 04 14 05 15 06 16 07 17 08
加上首位元素即可符合要求
01 11 02 12 03 13 04 14 05 15 06 16 07 17 08 18
//至此已经搞定,是不是很有意思 呵呵
//欢迎大家讨论更巧妙的办法..
...全文
1214 点赞 收藏 37
写回复
37 条回复

还没有回复,快来抢沙发~

发动态
发帖子
C++ 语言
创建于2007-09-28

3.1w+

社区成员

24.8w+

社区内容

C++ 语言相关问题讨论,技术干货分享
社区公告
暂无公告