字符串问题

题目描述:
请创建一个一维字符型数组,键盘输入数组长度以及数组元素,要求动态创建数组空间,数组元素为英文大小写字母,将小写字母排在前面,大写字母排在后面,要求按照原来的次序不变。
输入样例:
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;

 

但是我感觉上面的方法都有点投机取巧,事实上并没有真正的排序出来,为了这个题,我特地向我们辅导员请教,结果就不说了…所以到目前为止我还没有掌握比较好的排序的算法。

posted @ 2011-11-26 10:48  学-无止境  阅读(160)  评论(1编辑  收藏  举报