编写一个程序,将输入字符串中的字符按如下规则排序。
规则 1 :英文字母从 A 到 Z 排列,不区分大小写。
如,输入: Type 输出: epTy
规则 2 :同一个英文字母的大小写同时存在时,按照输入顺序排列。
如,输入: BabA 输出: aABb
规则 3 :非英文字母的其它字符保持原来的位置。
如,输入: By?e 输出: Be?y
数据范围:输入的字符串长度满足
编写一个程序,将输入字符串中的字符按如下规则排序。
规则 1 :英文字母从 A 到 Z 排列,不区分大小写。
如,输入: Type 输出: epTy
规则 2 :同一个英文字母的大小写同时存在时,按照输入顺序排列。
如,输入: BabA 输出: aABb
规则 3 :非英文字母的其它字符保持原来的位置。
输入字符串
输出字符串
A Famous Saying: Much Ado About Nothing (2012/8).
A aaAAbc dFgghh: iimM nNn oooos Sttuuuy (2012/8).
#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; }
//思路:读取字符串中的所有字母,由于字母不分大小写,所以只要遇到字母,就加到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; }
#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; // } // } // } // } // }
#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); // 将修改后的字符串打印到标准输出 }
#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; }
#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++]); } } } }
//萌新的朴素解法 #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; }
#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; }
#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; }
#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; }
#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; }
#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; }