如果不限制空间和时间,这个题目很简单,统计RGB的个数在重新填充或者干脆用数字排序。但是如果限定了空间和时间就要动点脑子。
思路大概是将后面的RG按顺序拿到前面,并记下每次应该插入的位置:
1.r.g分别记录R,G的插入位置,从头开始遍历数组。
2. 如果a[i]是R,交换++r和i位置的数,并且将g++,如果交换后i指向的是G,再G换回来。
3.如果啊a[i]是G交换++g位置和i位置的数。
#include<stdio.h>
void swap(char *a,int low, int high)
{
char temp;
temp = a[low];
a[low]=a[high];
a[high]=temp;
}
char *sort(char *a,int low, int high)
{
int r=low-1,g=low-1,i;
for(i=0;i<high;i++)
{
if(a[i]=='R')
{
swap(a,++r,i);
g++;
if(a[i]=='G')
swap(a,g,i);
}else if (a[i]=='G')
swap(a,++g,i);
}
}
int main()
{
char a[10] = "RGBBRGGBGB",*b;
int len=strlen(a),i;
b = sort(a,0,len);
printf("%d\n",len);
for(i=0;i<len;i++)
{
printf("%c",a[i]);
}
}