原题链接:提取数字串按数值排序
解题思路:
1.处理 0 的个数,遍历到0 的时候,判断 左右是否为 数字,为数字 直接continue,不为数字 直接 zero++, zero 表示是0的个数
2.用count变量 记录0 以外的数字 的个数。之后malloc 申请数组空间
3.处理1-9,遍历到1-9范围的数字直接加到temp变量中,遍历到数字以外的 字符时候(此时temp即为字符中的数字),将temp加入到res数组当中,
4.qsort之后,遍历输出即可
注意事项:
字符为0的情况,单独处理,测试用例里面 貌似没有0 的情况
参考代码:
#include<stdio.h> #include<stdlib.h> #include<string.h> int cmp(const void *a,const void *b){ return *(int*)a - *(int*)b; } int main() { char str[300]; scanf("%s",str); int index=0,temp=0,count=0; for(int i=0;str[i]!='\0';i++){ if( str[i]>='0' && str[i]<='9' ){ temp=1; break; } } if(temp==0){ printf("0"); return 0; } temp=0; int zero=0; int j=0; for( j=0;j<strlen(str)-1;j++){ if(str[j]=='0'){ if(str[j-1]>='1' && str[j]<='9' && j-1>0){ continue; }else if(str[j+1]>='1' && str[j]<='9' && j+1<strlen(str)){ continue; }else{ zero++; } } } for(int i=0;str[i]!='\0';i++){ if( str[i]>='0' && str[i]<='9' ){ temp*=10; temp+=(str[i] - 48); } if( !(str[i]>='0' && str[i]<='9') && temp!=0 ){ count++; //printf("%d ",temp); temp=0; } if(i==strlen(str)-1 && (str[i]>='0' && str[i]<='9')){ count++; temp=0; } } int *res=malloc(sizeof(int ) * (count+zero)); temp=0; for(int i=0;i<zero;i++) res[index++]=0; for(int i=0;str[i]!='\0';i++){ if( str[i]>='0' && str[i]<='9' ){ temp*=10; temp+=(str[i] - 48); } if( !(str[i]>='0' && str[i]<='9') && temp!=0){ res[index++]=temp; //printf("%d ",temp); temp=0; } if(i==strlen(str)-1 && (str[i]>='0' && str[i]<='9')){ res[index++]=temp; //printf("%d ",temp); temp=0; } } qsort(res,count,sizeof(int) ,cmp); for(int i=0;i<count+zero;i++){ printf("%d",res[i]); if(i!=count-1) printf(","); } // printf("\ntemp=%d",zero); return 0; }
0.0分
1 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复