求指教,uc笔试题,将2n个数据按要求重排,要求时间复杂度O(n),空间复杂度O(1)

I_am_mixi 2013-04-29 11:14:01
/*
将2n个数据{a1,a2,...an,b1,b2,..bn} 重新排列,排成{a1,b1,a2,b2...an,bn},要求时间复杂度O(n),空间复杂度O(1)。
以上是原题,但是下面我把原数据改成{A,B,C,D,...,a,b,c,d...}
*/
#include<iostream>
#include<string>
using namespace std;
int main()
{

int i=0,n;
string data;
int num[100];

cout<<"输入n值:";
cin>>n;

while(i<n)
{data+=('A'+i);i++;}

i=0;
while(i<n)
{data+='a'+i;i++;}

cout<<"目前的状态:"<<data;

getchar();
getchar();


for(i=0;i<2*n+1;i++)
num[i]=0;//cout<<num[i];}
//cout<<"kkk";cout<<num;getchar();
i=1;
char value=data[i],value2;
while(num[2*n]<2*n)//
{
if(!num[i])
{
if(i<n)
{
num[i]=1;
i=2*i;
}
else
{
num[i]=1;
i=(i-n+1)*2-1;
}
value2=data[i];
data[i]=value;
value=value2;
num[2*n]++;
}
else
{
i=(i+1)%(2*n);
value=data[i];
}

}

cout<<data;
getchar();
return 1;
}
...全文
227 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
I_am_mixi 2013-05-03
  • 打赏
  • 举报
回复
引用 7 楼 lin5161678 的回复:
数组下标奇数的交换而已吧
看清楚点。不是的
lin5161678 2013-05-03
  • 打赏
  • 举报
回复
数组下标奇数的交换而已吧
bluewanderer 2013-05-03
  • 打赏
  • 举报
回复
用现成的算法的话,这其实就是一个inplace merge。Inplace merge你可以直接去看STL里stable_sort的源码。
youyou1912 2013-05-03
  • 打赏
  • 举报
回复
操蛋的完美洗牌题目. 知道的复述一下就好, 不知道的想破头都不可能很快想出. 先腾讯, 再阿里, UC被阿里收购后, 就用阿里的题目了? 哈
lin5161678 2013-05-03
  • 打赏
  • 举报
回复
引用 8 楼 mixi57 的回复:
[quote=引用 7 楼 lin5161678 的回复:] 数组下标奇数的交换而已吧
看清楚点。不是的[/quote]的确我看岔了
就是那个党伟 2013-05-03
  • 打赏
  • 举报
回复
引用 2 楼 nice_cxf 的回复:
memmove复杂度是o(n)不是o(1), 完美洗牌算法,还是有点复杂的 http://user.qzone.qq.com/414353346/blog/1243343118#!app=2&via=QZ.HashRefresh&pos=1243343118
这个靠谱
I_am_mixi 2013-05-02
  • 打赏
  • 举报
回复
引用 3 楼 hlyces 的回复:
这是洗牌?不就是交换么?
名字而已。
I_am_mixi 2013-05-02
  • 打赏
  • 举报
回复
引用 2 楼 nice_cxf 的回复:
memmove复杂度是o(n)不是o(1), 完美洗牌算法,还是有点复杂的 http://user.qzone.qq.com/414353346/blog/1243343118#!app=2&via=QZ.HashRefresh&pos=1243343118
的确,复杂,目前你的回答是最靠谱的。谢谢!!我感觉我做的时候也是跟你链接里面的思路是一样的,就是轮转,不知道我这样写对不对?
I_am_mixi 2013-05-02
  • 打赏
  • 举报
回复
引用 1 楼 yudahai109 的回复:
.....貌似这题就是考你memmove吧, int arr[2n] = {a1,a2,...an,b1,b2,..bn}; for(int i = 0;i<n;i++) { int temp = *(arr+n+i); memmove(arr+i+2,arr+i+1,n-1); *(arr+i+1) = temp; } 代码没有经过验证,估计差不多这样了。你把memmove这个函数看一下就好了,http://www.cplusplus.com/reference/cstring/memmove/ 有例子的
例子我看了,也理解了。但是,我不懂的是这跟我题目有什么关系??? 要从{a1,a2,...an,b1,b2,..bn} 到{a1,b1,a2,b2...an,bn},不需要要到你给的那个函数也可以吧! 你可能是看错题意了。
hlyces 2013-05-02
  • 打赏
  • 举报
回复
这是洗牌?不就是交换么?
nice_cxf 2013-05-02
  • 打赏
  • 举报
回复
memmove复杂度是o(n)不是o(1), 完美洗牌算法,还是有点复杂的 http://user.qzone.qq.com/414353346/blog/1243343118#!app=2&via=QZ.HashRefresh&pos=1243343118
有新工作否 2013-05-02
  • 打赏
  • 举报
回复
.....貌似这题就是考你memmove吧, int arr[2n] = {a1,a2,...an,b1,b2,..bn}; for(int i = 0;i<n;i++) { int temp = *(arr+n+i); memmove(arr+i+2,arr+i+1,n-1); *(arr+i+1) = temp; } 代码没有经过验证,估计差不多这样了。你把memmove这个函数看一下就好了,http://www.cplusplus.com/reference/cstring/memmove/ 有例子的

64,648

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧