首页 > 试题广场 >

字符串排序

[编程题]字符串排序
  • 热度指数:275268 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M
  • 算法知识视频讲解

编写一个程序,将输入字符串中的字符按如下规则排序。

规则 1 :英文字母从 A 到 Z 排列,不区分大小写。

如,输入: Type 输出: epTy

规则 2 :同一个英文字母的大小写同时存在时,按照输入顺序排列。

如,输入: BabA 输出: aABb

规则 3 :非英文字母的其它字符保持原来的位置。

如,输入: By?e 输出: Be?y

数据范围:输入的字符串长度满足


输入描述:
输入字符串


输出描述:
输出字符串
示例1

输入

A Famous Saying: Much Ado About Nothing (2012/8).

输出

A aaAAbc dFgghh: iimM nNn oooos Sttuuuy (2012/8).
看到某个写法受到启发写了个简洁的,思路就是按照a到z的顺序输出,在输出到符号的位置输出符号。实际输出与预期输出是一样的可为什么过不了呢?

#include <stdio.h>
#include <string.h>
int main() {
    char str[1001] = { 0 }; int output = 0;  /*output表示已经输出的字符数量*/
    gets(str);
    int len = strlen(str);
    for (int i = 0; i < 26; i++)
    {
        char word = 'A' + i;
        for (int j = 0; j < len; j++)
        {
            if (str[output]<'A' || str[output]>'z' || (str[output]>'Z'&&str[output] < 'a')) /*即为非字母*/
            {
                printf("%c",str[output]);
                output++;
            }
            if (str[j] == word || str[j] == word + 32)
            {
                printf("%c", str[j]);
                output++;
            }
        }
    }
    return 0;
}

编辑于 2024-03-24 18:05:49 回复(0)
#include <stdio.h>
#include <string.h>

int main() {
    char str[1000];
    int str_count[1000];
    memset(str_count,0,sizeof(str_count));
    scanf("%[^\n]\n",str);
    char *x,*y=str;
    for(char i='A';i<='Z';i++)
    {
        for(int j=0;j<strlen(str);j++)
        {
            if(str_count[j])
            continue;
            else if(str[j]>='a'&&str[j]<='z')
            {
                if(str[j]=i-'A'+'a')
                {
                    printf("%c",str[j]);
                    str_count[j]++;
                }
            }
            else if(str[j]>='A'&&str[j]<='Z')
            {
                if(str[j]=i)
                {
                    printf("%c",str[j]);
                    str_count[j]++;
                }
            }
            else {
                printf("%c",str[j]);
                str_count[j]++;
            }
        };
    }
    
    return 0;
}

为什么会这样啊????
编辑于 2024-02-25 19:08:36 回复(1)
#include <stdio.h>
int main(void)
{
    char str[100], stand[100] ;
    while(scanf("%s", str)==1){
    int a, b,c=strlen(str),k=0;
    for (b = 'A'; b <= 'Z'; b++)
    {   
        for (a = 0; a < c; a++)
        {
            
            if (str[a] == b || str[a] - 32 == b)
            {
                stand[k] = str[a];
                k++;
            }
        }
    }

    k = 0;
    for (a = 0; a < c; a++)
    {
        if (str[a] >= 'A' && str[a] <= 'Z' || str[a] >= 'a' && str[a] <= 'z')
            printf("%c", stand[k++]);
        else printf("%c", str[a]);
    }   
    printf("\n");
    }
    return 0;
}
发表于 2024-01-28 23:03:50 回复(0)
//思路:读取字符串中的所有字母,由于字母不分大小写,所以只要遇到字母,就加到alp字符组中
//输出时遍历str,遇到字母就输出alp中的字符,遇到非字母则输出str中的内容

#include <stdio.h>
#include <string.h>

int main(){
    char str[1001] = {'\0'},alp[1001] = {'\0'};
    int n = 0;
    gets(str);
    for(int i = 0 ; i < 26 ; i++ ){ //从'a'/'A'开始遍历
        for(int j = 0 ; j < strlen(str) ; j++){
            if(str[j] - 'a' == i || str[j] - 'A' == i ) //例如:str[j]中遇到b/B,则会把str[j]放在alp[n]中,然后n++
                alp[n++] = str[j];
        }
    }
    //printf("%s\n",alp);   //输出alp中的所有字母
    n = 0;
    for(int i = 0 ; i < strlen(str) ; i++ ){
        if( (str[i] >= 'a' && str[i] <= 'z') || (str[i] >= 'A' && str[i] <= 'Z') ){
            printf("%c",alp[n++]);
        }
        else
            printf("%c",str[i]);
    }
    return 0;
}

编辑于 2023-12-23 19:43:34 回复(0)
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include <stdlib.h>
struct word
{
    char c;
    int index;//输入序号
};


int compare(const void *a, const void *b) 
{
    struct word *wordA = (struct word *)a;
    struct word *wordB = (struct word *)b;
    
    //比较字母大小,不考虑大小写,全部按照大写字母比较
    int diff = toupper(wordA->c) - toupper(wordB->c);
    if (diff != 0) 
    {
        return diff;
    }
    
    //如果字母相同,比较输入序号
    return wordA->index - wordB->index;
}

void sort(char str[],int len)
{
    struct word arr[1000]={0};//结构体数组,存放字母和输入序号
    int i=0;
    int j=0;
    for(i=0;i<len;i++) 
    {
        if(isalpha(str[i]))//是字母就存到排序数组中
        {
            arr[j].c = str[i];
            arr[j].index =i;
            j++;
        }
    }

    //compaer(arr,j);//排序
    qsort(arr, j, sizeof(struct word), compare);//使用qsort函数

    for(i =0,j=0;i<len;i++)//排序后替换到原来的数组中
    {
        if(isalpha(str[i]))
        {
            str[i]=arr[j].c;
            j++;
        }
    }
}

int main() 
{
    //输入
    char str[1001]={0};
    fgets(str,sizeof(str),stdin);
    int len= strlen(str)-1;
    //排序
    sort(str,len);
    //输出
    printf("%s",str);
    return 0;
}
//a-z
//1>2
//非英文不动

//这是排序过程的实现函数,也可以制定好规则后使用qsort函数。
//结构体数组按照字母大小排序
// void compaer(struct word arr[],int n)
// {
//     int i =0;
//     int j =0;
//     char tmp=0;
//     int tmp_index=0;
//     //冒泡排序
//     for(i=0;i<n;i++)
//     {
//         for(j=i;j<n;j++)
//         {
//             //比较字母大小,不考虑大小写,全部按照大写字母比较
//             if(toupper(arr[i].c)-toupper(arr[j].c)>0)
//             {
//                 //交换字母
//                 tmp =arr[i].c;
//                 arr[i].c =arr[j].c;
//                 arr[j].c =tmp;
//                 //交换序号
//                 tmp_index =arr[i].index;
//                 arr[i].index =arr[j].index;
//                 arr[j].index =tmp_index;
//             }
//             //如果字母相同,比较输入序号
//             else if(toupper(arr[i].c)-toupper(arr[j].c) ==0)
//             {
//                 if(arr[i].index>arr[j].index)
//                 {
//                 //交换字母
//                     tmp =arr[i].c;
//                     arr[i].c =arr[j].c;
//                     arr[j].c =tmp;
//                     //交换序号
//                     tmp_index =arr[i].index;
//                     arr[i].index =arr[j].index;
//                     arr[j].index =tmp_index;
//                 }
//             }
//         }
//     }
// }

发表于 2023-12-12 13:12:01 回复(0)
#include <stdio.h>
#include <string.h>
#include <ctype.h>

int main() {
    char str[1001];
    while (gets(str) != NULL) {
        int len = strlen(str);
        for(int i = 0;i<len-1 ;i++)
        {
            for(int j = 0;j<len-i-1;j++)
            {
                //判断是不是字母
                if(isalpha(str[j]))
                {
                    //是就冒泡排序
                    int k = j+1;
                    while(!isalpha(str[k])&&k<len-i-1)
                    {
                        k++;
                    }
                    if(toupper(str[j])-toupper(str[k])>0&& isalpha(str[k]))
                    {
                        char tmp = str[j];
                        str[j] = str[k];
                        str[k] = tmp;
                    }
                }
                else {
                continue;
                }
            }
        }
        for(int i = 0;i<len;i++)
        {
            printf("%c",str[i]);
        }
    }
    return 0;
}
发表于 2023-10-09 15:50:16 回复(0)
#include <stdio.h>
#include <ctype.h>  // 包含 isalpha() 函数的头文件
#include <stdlib.h> // 包含 qsort() 函数的头文件

// 比较两个字符并忽略大小写的函数
int compare(const void* a, const void* b) {
    // 将参数转换为 char 指针并解引用,将两个字符都转换为小写,然后相减得到差值
    return tolower(*(char*)a) - tolower(*(char*)b);
}

int main() {
    char str[1000], alp[1000]; // 输入字符串、排序字符串
    int id, len; // 输入字符串索引、排序字符串长度

    scanf("%s", str); // 从标准输入读取字符串到输入字符串中
    for (id = 0, len = 0; str[id]; id++) // 遍历输入字符串
        if (isalpha(str[id])) // 检查当前字符是否是字母
            alp[len++] = str[id];// 添加到排序字符串并更新长度
    qsort(alp, len, sizeof(char), compare); // 按字母顺序排序
    for (id = 0, len = 0; str[id]; id++) // 再次遍历输入字符串
        if (isalpha(str[id])) // 检查当前字符是否是字母
            str[id] = alp[len++]; // 用排序字符串的字符替换它
    printf("%s", str); // 将修改后的字符串打印到标准输出
}

发表于 2023-03-22 18:25:29 回复(0)
字母数量规模较小,直接空间换时间,用26个队列存储字母,总共遍历两边即可。
#include <stdio.h>
#include <ctype.h>
#include <string.h>

int main() {
    char queue[26][1000] = {0};
    int tail[26] = {0};
    char buf[1001] = {0};
    scanf("%[^\n]", buf);
    for (int i = strlen(buf)-1; i >= 0; --i) {
        if (!isalpha(buf[i])) {
            continue;
        }
        int idx = tolower(buf[i]) - 'a';
        queue[idx][tail[idx]++] = buf[i];
    }
    int idx = 0;
    for (int i = 0; i < 26; ++i) {
        while (tail[i] > 0) {
            if (!isalpha(buf[idx])) {
                printf("%c", buf[idx++]);
            } else {
                printf("%c", queue[i][tail[i]-1]);
                --tail[i];
                ++idx;
            }
        }
    }
    while (idx < strlen(buf)) {
        printf("%c", buf[idx++]);
    }
    return 0;
}


发表于 2022-08-16 11:59:10 回复(0)
获取输入时注意换行符
#include <stdio.h>
#include <string.h>

int main(){
    char a[1000];
    while(scanf("%s",a)!=EOF){
        int len=strlen(a);int k,j;char b[1000]={0};int n=0;
        for(j='a',k='A';j<='z',k<='Z';j++,k++){
            for(int m=0;m<len;m++){
                if(a[m]==k || a[m]==j){
                    b[n++]=a[m];
                }
            }
        }
        n=0;
        for(int m=0;m<len;m++){
            if(!((a[m]>='a' && a[m]<='z') || (a[m]>='A' && a[m]<='Z'))){
                printf("%c",a[m]);
            }
            else{
                printf("%c",b[n++]);
            }
        }
    }
}


发表于 2022-06-07 10:38:02 回复(0)
//萌新的朴素解法
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
//使用函数是为了方便理解,实际上直接在主函数里面写也完全可以

//检查一个字符是否为大小写字母,是字母返回1,否则返回0
int check_zimu(char ch){    
    if((ch>='A'&&ch<='Z')||(ch>='a'&&ch<='z')) return 1;
    return 0;
}

//输入两个英文字母,检查是否需要交换,需要交换返回1,否则返回0
int check_exchange(char slow,char fast){        
    if(slow>='a'&&slow<='z') slow-=('a'-'A');    //统一为大写
    if(fast>='a'&&fast<='z') fast-=('a'-'A');
    if(slow>fast)return 1;        //比较
    return 0;
}


int main(){
    char ch[1002];
    gets(ch);
    int len=strlen(ch);
    
    //构造辅助字符串,将原字符串的字母复制到辅助字符串,
    //并在原字符串中字母的原位置做标记(这里标记为'a'),方便还原。
    char ch2[1002];
    int p_ch=0,p_ch2=0;
    for(p_ch=0;p_ch<len;p_ch++){
        int flag=check_zimu(ch[p_ch]);
        if(flag==1){
            ch2[p_ch2++]=ch[p_ch];
            ch[p_ch]='a';
        }
    }
    
    //在辅助字符串中对英文字母进行排序
    for(int slow=0;slow<p_ch2-1;slow++){
        int exchange=slow;
        for(int fast=slow+1;fast<p_ch2;fast++){
            int flag=check_exchange(ch2[exchange], ch2[fast]);
            if(flag==1){
                exchange=fast;
            }
        }
        if(exchange!=slow){
            char temp=ch2[exchange];
            for(int i=exchange-1;i>=slow;i--){
                ch2[i+1]=ch2[i];
            }
            ch2[slow]=temp;
        }
    }
    
    //将排序好的辅助字符串重新插入原字符串有标记的位置
    p_ch2=0;
    for(p_ch=0;p_ch<len;p_ch++){
        if(ch[p_ch]=='a'){
            ch[p_ch]=ch2[p_ch2++];
        }
    }
    
    printf("%s",ch);

    return 0;
}

发表于 2022-04-20 16:18:58 回复(0)
#include <stdio.h>
#include <string.h>
#define    N    1000
int main()
{
    char str[N],temp[N],ch;
    int i,j,k,len,flag[N]={0},m='a'-'A',f;
    gets(str);
    len=strlen(str);
    for(i=0,j=0;i<len;i++)
    {
        if((str[i]>='A'&&str[i]<='Z')||(str[i]>='a'&&str[i]<='z'))
        {
            if(str[i]>='A'&&str[i]<='Z')
            {
                temp[j]=str[i]+m;
                flag[j]=1;
            }
            else
            {
                temp[j]=str[i];
            }
            j++;
        }
    }
    k=j;
    for(i=0;i<k-1;i++)
    {
        for(j=0;j<k-1-i;j++)
        {
            if(temp[j]>temp[j+1])
            {
                ch=temp[j];
                temp[j]=temp[j+1];
                temp[j+1]=ch;
                f=flag[j];
                flag[j]=flag[j+1];
                flag[j+1]=f;
            }
        }
    }
    for(i=0,j=0;i<len;i++)
    {
        if(!((str[i]>='A'&&str[i]<='Z')||(str[i]>='a'&&str[i]<='z')))
        {
            continue;
        }
        else
        {
            if(flag[j]==1)
            {
                temp[j]-=m;
            }
            str[i]=temp[j];
            j++;
        }
    }
    printf("%s\n",str);
    return 0;
}

发表于 2022-04-19 11:38:16 回复(0)
#include<stdio.h>
#include<ctype.h>
int main(void)
{
    char ch[1001],temp[1001]="";
    int i,j,k=0;
    gets(ch); //获取字符串
    //先将原字符串中的字母取出
    for(i=0;ch[i]!='\0';i++)
    {
        if((ch[i]>='a'&&ch[i]<='z')||(ch[i]>='A'&&ch[i]<='Z'))
            temp[k++]=ch[i];
    }
    //对字母数组排序,需要用冒泡排序,用选择排序会出现字母出现顺序被打乱的问题
    for(i=0;i<k;i++)
        {
            for(j=0;j<k-i-1;j++)
            {
                if(tolower(temp[j])>tolower(temp[j+1]))
                {
                    char l=temp[j];
                    temp[j]=temp[j+1];
                    temp[j+1]=l;
                }
            }
        }
    //将排好序的字母放回原字符串,根据字符是否为字母按顺序放回
    for(i=0,j=0;ch[i]!='\0';i++)
    {
        if((ch[i]>='a'&&ch[i]<='z')||(ch[i]>='A'&&ch[i]<='Z'))
            ch[i]=temp[j++];
    }
    puts(ch); //输出结果
    return 0;
}

发表于 2022-04-06 15:01:10 回复(0)
#include<stdio.h>
#include<string.h>
#include<ctype.h>

int main()
{
    char str[1001]={'\0'};      //用一个数组储存原始字符串。
    while (scanf("%[^\n]",str)!=EOF)
    {
        getchar();        //处理掉换行符       
        int n=strlen(str) ;
        char copy[1001]={'\0'};
        char out[1001]={'\0'};
        int num=0;
        int temp=0;
        for(int i=0;i<n;i++)     //用另外一个数组temp来储存纯字母的字符串。
        {  
            if(isalpha(str[i]))
            {
                copy[num]=str[i];
                num++;
            }
        }
        for(int i=65;i<91;i++)     //给数组temp按照字母升序排序(不区分大小写),并赋值给另外一个数组out作为输出。
            for(int j=0;j<num;j++)
                if(copy[j]==i || copy[j]==i+32)
                    {
                        out[temp++]=copy[j];
                    }
        temp=0;
        for(int i=0;i<n;i++)     //遍历处理输出,若是字母则输出out对应的字符,否则输出其他字符。
        {
            if(isalpha(str[i]))
                printf("%c",out[temp++]);
            else
                printf("%c",str[i]);
        }
        printf("\n");
    }
    
    return 0;
}

发表于 2022-02-27 20:29:39 回复(0)
#include<stdio.h>
#include<string.h>
int main()
{
    char str[1024]={0};
    char out[1024]={0};
    while(scanf("%[^\n]",str)!=EOF){  //scanf+%s不能读入空格
        scanf("%*[^\n]");scanf("%*c");
        int len=strlen(str);
        char ch='A';
        int j=0;
        while(ch<='Z'){
            for(int i=0;i<len;i++){
                if((str[i]>='a'&&str[i]<='z')||(str[i]>='A'&&str[i]<='Z')){
                    if(str[i]==ch||str[i]==ch+32){
                        //int j=0;//放在里面每次都要循环,加大计算次数
                        while(out[j]!=0)j++;
                        out[j]=str[i];
                    }
                }else {
                    out[i]=str[i];
                }
            }
            ch++;
        }
        printf("%s\n",out);

        for(int i=0;i<len;i++){
            str[i]=0;
            out[i]=0;
        }
    }
    return 0;
}


发表于 2022-01-23 13:57:45 回复(0)
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
int main()
{
	char a[1002] = { 0 };
	char b[1002] = { 0 };
	int s, i,k=0;
	char j,m;

	while (gets(a)!=NULL)
	{
		k = 0;
		s = strlen(a);
		for (j = 'a',m='A'; j <= 'z'&&m<='Z'; j++,m++)
		{
			for (i = 0; i < s; i++)
			{
				if (a[i] == j || a[i] == m)
				{
					b[k] = a[i];
					k++;
				}
			}
		}

		for (i = 0,k=0; i < s; i++)
		{
			if (a[i] >= 'a' && a[i] <= 'z' || a[i] >= 'A' && a[i] <= 'Z')
			{
				printf("%c", b[k]);
				k++;
			}
			else
			{
				printf("%c", a[i]);
			}
		}
		printf("\n");
	}

	return 0;
}

发表于 2022-01-22 15:02:20 回复(0)