排序
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 56209 Accepted Submission(s): 16422
Problem Description
输入一行数字,如果我们把这行数字中的‘5’都看成空格,那么就得到一行用空格分割的若干非负整数(可能有些整数以‘0’开头,这些头部的‘0’应该被忽略掉,除非这个整数就是由若干个‘0’组成的,这时这个整数就是0)。 你的任务是:对这些分割得到的整数,依从小到大的顺序排序输出。
Input
输入包含多组测试用例,每组输入数据只有一行数字(数字之间没有空格),这行数字的长度不大于1000。 输入数据保证:分割得到的非负整数不会大于100000000;输入数据不可能全由‘5’组成。
Output
对于每个测试用例,输出分割得到的整数排序的结果,相邻的两个整数之间用一个空格分开,每组输出占一行。
Sample Input
0051231232050775
Sample Output
0 77 12312320
低级做法:
使用字符串保存数据,设置一个保存数字的数组,再一个个字符遍历过去,把字符添加到对应的数字数组的位置。(注意:这种做法要分是不是以字符“5”结尾)
#include <stdlib.h>
#include <iostream>#include <cstdio>#include <cstring>#include <vector>#include <algorithm>using namespace std;long long int a[1005];int main(){ char ch[1005]; while(scanf("%s",ch)!=EOF) { memset(a,0,sizeof(a)); int len=strlen(ch),k=0,flag=1; for(int i=0; i<len; i++) { if(ch[i]=='5'&&flag==0) { k++; flag=1; }else if(ch[i]!='5')
{ flag=0; a[k]=a[k]*10+ch[i]-'0'; } } if(ch[len-1]=='5') { sort(a,a+k); for(int i=0; i<k-1; i++) { printf("%lld ",a[i]); } printf("%lld\n",a[k-1]); } else { sort(a,a+k+1); for(int i=0; i<k; i++) { printf("%lld ",a[i]); } printf("%lld\n",a[k]); }}
return 0;}高级一点的:
使用strtok 和 atoi函数
strtok函数是将字符串按所给的字符分开的函数(注意:使用一次之后要归NULL 它会自动指向下一个分的块)
atoi 是一个将字符串的数据改成整形数据的函数 具体的可以百度一下
#include <stdlib.h>
#include <iostream>#include <cstdio>#include <cstring>#include <vector>#include <algorithm>using namespace std;int main(){ int n,num; int a[1100]; char ch[1100],*p; while(scanf("%s",ch)!=EOF) { num=0; p=strtok(ch,"5"); while(p!=NULL) { a[num++]=atoi(p); p=strtok(NULL,"5"); } sort(a,a+num); for(int i=0;i<num-1;i++) printf("%d ",a[i]); printf("%d\n",a[num-1]); } return 0;}