在O(n)的时间,O(1)的空间将这个序列顺序改为a1,b1,a2,b2,a3,b3,...,an,bn,
且不需要移动,通过交换完成,只需一个交换空间。
看着好像挺难的。
思路:利用串的规律,紧追下一个an和bn的位置,用an和bn从前往后一个坑一个坑得去填。
直接上代码吧
-----------------------------------------------------------------------------
a为下一个A系列的下标,b为下一个B系列的下标
第一个和最后一个位置不用变
而且最后一次交换:(Bn-1,An-1),换完就成了,所以循环下标为:1-(n-3)
-----------------------------------------------------------------------------
char *exchange(char *str){
int a = 1, b = strlen(str) / 2;
for(int i = 1; i < strlen(str) - 2; i ++){
if(i%2 == 1){ //填B系列
swap(str[i], str[b]);
a = b++;
}else{ //填A系列
swap(str[i], str[a]);
a ++;
}
}
return str;
}
-----------------------------------------------------------------------------
欢迎验证和指证。