我們已經知道了將N個整數按從小到大排序的冒泡排序法。本題要求將此方法用於字符串序列,並對任意給定的K(
輸入格式:
輸入在第1行中給出N和K(1≤K
輸出格式:
輸出冒泡排序法掃描完第K遍后的中間結果序列,每行包含一個字符串。
輸入樣例:
6 2
best
cat
east
a
free
day
輸出樣例:
best
a
cat
day
east
free
這道題為什么有20分?一方面是涉及排序算法,另一方面估計是考察你在不用函數庫提供的某些函數的情況下解決此題,如果此題不用函數庫提供的一些函數,那么此題將會比用函數難上一個台階。拿C語言來說,如果不用strcmp,你自己手動寫一個,是要花相當多的時間的,難點就在於比較首字符,再比較后續字符的算法如何寫。但是如果你用了函數,那就沒什么思維含量了。所以以下先描述下C++手動比較的算法:
定義一個字符串數組,在字符串首字符相等的情況下,思路是平行移動比較后續字符,循環變量的上限是兩字符串的長度最小者,如果字符逆序,交換,退出循環,如果字符順序,退出循環,如果字符相等,繼續比較下一個。比如第一個字符串是abc,第二個是ab,則比完a和b啥也沒做循環就結束了。第一個是abc,第二個是acb,比到第二個字符判定是順序的就退出循環。第一個是acb,第二個是abc,第二個字符逆序,將兩字符串在字符串數組中的位置交換,退出循環,以下是具體代碼:
#include
#include
#include
using namespace std;
int main()
{
int N,K;
cin>>N>>K;
string s[N];/*定義字符串數組*/
for(int i=0;i
cin>>s[i];
for(int i=0;i
for(int j=0;j
{
if(s[j][0]>s[j+1][0])/*如果兩個串的首個字符逆序*/
swap(s[j],s[j+1]);
else if(s[j][0]==s[j+1][0])/*如果兩個串的首個字符相等*/
{
int minlen=min(s[j].length(),s[j+1].length());/*取兩串的長度最小者*/
for(int k=0;k
{
if(s[j][k]>s[j+1][k])/*如果字符逆序*/
{
swap(s[j],s[j+1]);
break;/*交換后退出*/
}
else if(s[j][k]
break;/*退出*/
}
}
}
for(int i=0;i
cout<
return 0;
}
如果用了比較函數呢?C語言是strcmp,交換時用臨時字符串通過strcpy來完成,但是C++不用比較函數,本身自帶的函數庫用起來會有開掛的效果。。直接像比較數字那樣寫就行了。。代碼如下:
#include
#include
#include
using namespace std;
int main()
{
int N,K;
cin>>N>>K;
string s[N];
for(int i=0;i
cin>>s[i];
for(int i=0;i
for(int j=0;j
if(s[j]>s[j+1])
swap(s[j],s[j+1]);
for(int i=0;i
cout<
return 0;
}綜上,字符串問題,如果實在想不出來相關算法,可以用函數庫自帶的一些函數解決,但最好是自己先努力想,這樣才能提高編程功底。