给定一个数组,该数组存贮R,G,B三种字符,将该数组按RGB顺序排序,不能使用辅助内存空间,且只能遍历数组一次。

如果不限制空间和时间,这个题目很简单,统计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]);
	}

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值