```c #include<iostream> #include<algorithm> using namespace std; struct node{ string s; int num; int havenum;//有数字为0,没数字为1 }A[110]; bool cmp(node x,node y){ if(x.havenum!=y.havenum) return x.havenum<y.havenum; else{ if(x.havenum==1&&x.num!=y.num){ return x.num<y.num; } else return x.s<y.s; } } void setvalue(string s,node &a){ a.s=s; a.num=0; a.havenum=0; for(int i=0;i<s.size();i++){ if(s[i]>='0'&&s[i]<='9'){ a.havenum=1; a.num=a.num*10+(s[i]-'0'); } } } int main() { string s; int k=0; while(cin>>s) setvalue(s,A[k++]); sort(A,A+k,cmp); for(int i=0;i<k;i++){ cout<<A[i].s; if(i!=k-1) cout<<" "; } return 0; }
```
C的写法,调试的时候发现了许多漏洞,分享一下AC代码
#include <stdio.h> #include <stdlib.h> #include <string.h> typedef struct {char str[31]; int n;}S; int cmp(const void *a, const void *b) { S *p1=(S*)a, *p2=(S*)b; if(p1->n==p2->n) return strcmp(p1->str,p2->str); return p1->n-p2->n; } int main(void) { char all[3005]; S s[100]={0}; gets(all); int cnt=0, number=0, i=0, j=0, check=0; while(all[j]!='\0') { if(all[j]==' ') { s[cnt].str[i]='\0'; if(check==1)s[cnt].n=number; else {s[cnt].n=-1;} cnt++; number=0; i=0; check=0; } else s[cnt].str[i++]=all[j]; if(all[j]>='0'&&all[j]<='9'){ number=number*10+(all[j]-'0'); check=1;} j++; } s[cnt].str[i]='\0'; if(check==1)s[cnt].n=number; else {s[cnt].n=-1;} cnt++; qsort(s, cnt, sizeof(s[0]), cmp); for(i=0;i<cnt-1;++i) printf("%s ",s[i].str); printf("%s\n",s[i].str); return 0; }
C++的写法,供大家参考
using namespace std; string tmp; vector V;
int q(string aa) { int ll=aa.length(); int isnum=0,pos; for(int i=0;i>ret; return ret; } } int cmp(string aa,string bb) { int numa=q(aa),numb=q(bb); if(numa!=numb) return numa>tmp) V.push_back(tmp); sort(V.begin(),V.end(),cmp); cout<<V[0]; for(int i=1;i<V.size();i++) cout<<’ ‘<<V[i]; cout<<endl; return 0; }
AC代码供参考
using namespace std; string strs[105]; bool hasNum(string str) { for (int i = 0; i < str.length(); i++) { if (str[i] >= ‘0’ && str[i] <= ‘9’) return true; } return false; } bool cmp(string a, string b) { if (hasNum(a) && !hasNum(b)) return false; if (!hasNum(a) && hasNum(b)) return true; if (!hasNum(a) && !hasNum(b)) return a < b; int num1 = 0,num2 = 0; for (int i = 0; i < a.size(); i++) { if (a[i] >= ‘0’ && a[i] <= ‘9’) { while (i < a.size() && a[i] >= ‘0’ && a[i] <= ‘9’) { num1 = num1 * 10 + (a[i] - ‘0’); i++; } break; } } for (int i = 0; i < b.size(); i++) { if (b[i] >= ‘0’ && b[i] <= ‘9’) { while (i < b.size() && b[i] >= ‘0’ && b[i] <= ‘9’) { num2 = num2 * 10 + (b[i] - ‘0’); i++; } break; } } if (num1 == num2) return a < b; return num1 < num2; } int main() { int cnt = 0; string str; char c; while (cin >> str) { strs[cnt++] = str; if ((c = getchar()) == ‘\n’) break; } if (cnt == 1) { cout << str << endl; return 0; } sort(strs,strs+cnt,cmp); for (int i = 0; i < cnt-1; i++) cout << strs[i] << ” “; cout << strs[cnt-1] << endl; return 0; }
这个有什么特殊情况吗 数字大小相同时,仍然沿用原来的strcmp方式。我是没注意这个。。
不知道哪里有问题,第6个一直过不掉,有人帮忙看看么
using namespace std; const int maxn=110; string str[maxn];
bool strnumcmp (string str1,string str2) { int str1Num1=-1; int str2Num1=-1; int num1=0; int num2=0; int flag=0;//表示第一个数字没找到 for(int i=0;i=‘0’&&str1[i]<=‘9’) { if(flag==0) { str1Num1=i; flag=1;//寻找最后一个数字下标 } num1++; } } flag=0;//表示第一个数字没找到 for(int i=0;i=‘0’&&str2[i]<=‘9’) { num2++; if(flag==0) { str2Num1=i; flag=1;//寻找最后一个数字下标 } } } //两个都没有数字 if(str1Num1==-1&&str2Num1==-1) { return str1<str2; } //一个有数字,一个没有数字 else if(str1Num1!=-1&&str2Num1==-1) { return false; } else if(str1Num1==-1&&str2Num1!=-1) { return true; } //两个都有数字 else if(str1Num1!=-1&&str2Num1!=-1) { if(num1==num2) { int i=str1Num1; int j=str2Num1; while(i<(str1Num1+num1)) { if(str1[i]!=str2[j]) { return str1[i]<str2[j]; } i++; j++; } if(i==(str1Num1+num1)) { return str1num2) return false; else return true; } } }
int main() { int num=0; while(cin>>str[num]) { num++; } sort(str,str+num,strnumcmp); for(int i=0;i<num;i++) { cout<<str[i]; if(i<(num-1)) { printf(” “); } } printf(“\n”); return 0;
}
```
C的写法,调试的时候发现了许多漏洞,分享一下AC代码
C++的写法,供大家参考
include
using namespace std;
string tmp;
vector V;
int q(string aa)
{
int ll=aa.length();
int isnum=0,pos;
for(int i=0;i>ret;
return ret;
}
}
int cmp(string aa,string bb)
{
int numa=q(aa),numb=q(bb);
if(numa!=numb) return numa>tmp) V.push_back(tmp);
sort(V.begin(),V.end(),cmp);
cout<<V[0];
for(int i=1;i<V.size();i++) cout<<’ ‘<<V[i];
cout<<endl;
return 0;
}
AC代码供参考
include
include
include
include
include
include
using namespace std;
string strs[105];
bool hasNum(string str)
{
for (int i = 0; i < str.length(); i++)
{
if (str[i] >= ‘0’ && str[i] <= ‘9’)
return true;
}
return false;
}
bool cmp(string a, string b)
{
if (hasNum(a) && !hasNum(b)) return false;
if (!hasNum(a) && hasNum(b)) return true;
if (!hasNum(a) && !hasNum(b)) return a < b;
int num1 = 0,num2 = 0;
for (int i = 0; i < a.size(); i++)
{
if (a[i] >= ‘0’ && a[i] <= ‘9’)
{
while (i < a.size() && a[i] >= ‘0’ && a[i] <= ‘9’)
{
num1 = num1 * 10 + (a[i] - ‘0’);
i++;
}
break;
}
}
for (int i = 0; i < b.size(); i++)
{
if (b[i] >= ‘0’ && b[i] <= ‘9’)
{
while (i < b.size() && b[i] >= ‘0’ && b[i] <= ‘9’)
{
num2 = num2 * 10 + (b[i] - ‘0’);
i++;
}
break;
}
}
if (num1 == num2) return a < b;
return num1 < num2;
}
int main()
{
int cnt = 0;
string str;
char c;
while (cin >> str)
{
strs[cnt++] = str;
if ((c = getchar()) == ‘\n’) break;
}
if (cnt == 1)
{
cout << str << endl;
return 0;
}
sort(strs,strs+cnt,cmp);
for (int i = 0; i < cnt-1; i++)
cout << strs[i] << ” “;
cout << strs[cnt-1] << endl;
return 0;
}
这个有什么特殊情况吗
数字大小相同时,仍然沿用原来的strcmp方式。我是没注意这个。。
不知道哪里有问题,第6个一直过不掉,有人帮忙看看么
include
include
include
include
include
using namespace std;
const int maxn=110;
string str[maxn];
bool strnumcmp (string str1,string str2)
{
int str1Num1=-1;
int str2Num1=-1;
int num1=0;
int num2=0;
int flag=0;//表示第一个数字没找到
for(int i=0;i=‘0’&&str1[i]<=‘9’)
{
if(flag==0)
{
str1Num1=i;
flag=1;//寻找最后一个数字下标
}
num1++;
}
}
flag=0;//表示第一个数字没找到
for(int i=0;i=‘0’&&str2[i]<=‘9’)
{
num2++;
if(flag==0)
{
str2Num1=i;
flag=1;//寻找最后一个数字下标
}
}
}
//两个都没有数字
if(str1Num1==-1&&str2Num1==-1)
{
return str1<str2;
}
//一个有数字,一个没有数字
else if(str1Num1!=-1&&str2Num1==-1)
{
return false;
}
else if(str1Num1==-1&&str2Num1!=-1)
{
return true;
}
//两个都有数字
else if(str1Num1!=-1&&str2Num1!=-1)
{
if(num1==num2)
{
int i=str1Num1;
int j=str2Num1;
while(i<(str1Num1+num1))
{
if(str1[i]!=str2[j])
{
return str1[i]<str2[j];
}
i++;
j++;
}
if(i==(str1Num1+num1))
{
return str1num2)
return false;
else return true;
}
}
}
int main()
{
int num=0;
while(cin>>str[num])
{
num++;
}
sort(str,str+num,strnumcmp);
for(int i=0;i<num;i++)
{
cout<<str[i];
if(i<(num-1))
{
printf(” “);
}
}
printf(“\n”);
return 0;
}