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

来源:互联网 发布:scala编程思想 下载 编辑:程序博客网 时间:2024/05/19 19:30

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