字符串问题
题目描述:
请创建一个一维字符型数组,键盘输入数组长度以及数组元素,要求动态创建数组空间,数组元素为英文大小写字母,将小写字母排在前面,大写字母排在后面,要求按照原来的次序不变。
输入样例:
10
AbdBcDfgEF
输出样例:
bdcfgABDEF
看到这个题目,当天晚上我就想到了一种方法,代码如下.
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
char *sort(char *,int );
int i;
void main()
{
int n;
char *arr;
scanf("%d",&n);
getchar();
arr=(char*)calloc(n+1,1);
gets(arr);
puts(sort(arr,n));
free(arr);
}
char *sort(char *array, int m)
{
char *a,*b;
int k=0,l=0;
a=(char *)calloc(m,1);
b=(char *)calloc(m,1);
for(i=0;i<m;i++)
(array[i]>='a' ? a[k++] : b[l++]) = array[i];
strcat(a,b);
free(b);
return a;
}
------------------------------------------------------------------------------------------------------------------------------------
很明显这样做比较麻烦,速度慢而且又浪费资源.
然后学长按照我的思路改了一下,代码如下:
int main()
{
int length;
char *args;
scanf("%d",&length);
if(NULL==(args = (char *)malloc(length+1)))
{
exit(1);
}
scanf("%s",args);
char * temp = (char *)malloc(length+1);
int j=0;
for(int i=0 ; i<length ; i++)
{
args[i]<(int)'a'?temp[j++]=args[i]:printf("%c",args[i]);
}
temp[j]='\0';
printf("%s",temp);
free(temp);
free(args);
return 0;
}
但是还是用了一个缓存数组,比较浪费资源.
还有一种方法,思路很简单.
int length;
char *args;
scanf("%d",&length);
if(NULL==(args = (char *)malloc(length+1)))
{
exit(1);
}
scanf("%s",args);
for(int i=0 ; i<length ; i++)
if(args[i]>=(int)'a')
printf("%c",args[i]);
for(int i=0 ; i <length ; i++)
if(args[i]<(int)'a')
printf("%c",args[i]);
free(args);
return 0;
但是我感觉上面的方法都有点投机取巧,事实上并没有真正的排序出来,为了这个题,我特地向我们辅导员请教,结果就不说了…所以到目前为止我还没有掌握比较好的排序的算法。