1. 程式人生 > >EOJ(排序)——2878. 字串排序

EOJ(排序)——2878. 字串排序

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; }