EOJ(排序)——2878. 字串排序
阿新 • • 發佈:2019-01-11
2878. 字串排序
在 2010 年百度公司的一次校園招聘筆試中,要求應聘者設計一個 strnumcmp 函式。對比普通的 strcmp 函式,差別在於,當字串中包含數字時,比較數字大小。數字大小相同或不含數字時,仍然沿用原來的 strcmp 方式。所有不含數字的字串均小於含數字的字串。每個字串的長度範圍為 1 ~ 30,而其中包含的數字個數範圍為 0 ~ 8,且數字在一個字串中是連續的。
例如:strnumcmp 的判定結果:
“abc”<“abc#”<“abcd”<“abc1”<“abc2”<“abc10”
而一般的 strcmp 的判定結果:
“abc”<“abc#”<“abc1”<“abc10”<“abc2”<“abcd”
寫一個程式,用 strnumcmp 函式對一組字串按升序排序。
輸入
n 個由一個空格分隔的字串 (1⩽n⩽100)
輸出
排序後的 n 個字串,兩個字串之間用一個空格分開。
樣例
input
abc# abc1 abc10 abcd abc2 abc
output
abc abc# abcd abc1 abc2 abc10
提示
字串中可能包含0,如”a0”。並且”a0”>”zzzz”。
呼叫scanf函式時,正確讀取資料時返回讀入資料項的個數,小於1時通常表示資料讀完或讀取出錯。
在Windows環境中執行程式時,輸入Control+Z後輸入回車表示輸入流的結束。
題目大意:
字串排序,如果中間有數字,先比較數字。
題目解析:
把數字分離開來,結構體儲存數字大小和原來的字串。
具體程式碼:
#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;
}