文字列が与えられると、文字列内の各単語を1つずつフリップします。
例1:
输入:「空は青です」
输出:「青は空です」
输出:「青は空です」
例2:
入力:「hello world!」
出力:「world!Hello」
説明:入力ストリングの前後に余分なスペースを含めることができますが、反転した文字を含めることはできません。
出力:「world!Hello」
説明:入力ストリングの前後に余分なスペースを含めることができますが、反転した文字を含めることはできません。
例3:
入力:「良い例」
出力:「 良い例a」
説明:2つの単語の間に余分なスペースがある場合は、反転した単語間のスペースを1つに減らします。
出力:「 良い例a」
説明:2つの単語の間に余分なスペースがある場合は、反転した単語間のスペースを1つに減らします。
説明:
スペースのない文字は単語を形成します。
入力文字列には前後に余分なスペースを含めることができますが、反転した文字を含めることはできません。
2つの単語の間に余分なスペースがある場合は、反転後の単語間のスペースを1つだけに減らします。
アイデア:最初に頭と尾および囲まれたスペースを削除し、次に単語配列を使用して各単語を記録し、次に逆の順序でsに入力します。
学習:オンラインojはプログラム全体を1回実行するためのテストサンプルではないため、グローバル変数は1回クリアする必要があります。
1 文字の DealS [ 10000 ] = { 0 }; 2 文字の単語[ 10000 ] = { 0 }; 3 4 char * reverseWords(char * s) 5 { 6 int temBegin; 7 int temEnd; 8 int k = -1、l = -1 ; 9 int len = strlen(s); 10 memset() 11 for(temBegin = 0 ; temBegin <strlen(s); temBegin ++) // 先頭のスペースを削除 12 { 13 if(s [temBegin]!= ' ' ) 14 break ; 15 } 16 17 for(temEnd = strlen(s)-1 ; temEnd> = 0 ; temEnd--) // 削除終了スペース 18 { 19 if(s [temEnd]!= ' ' ) 20 break ; 21 } 22 for(int i = temBegin; i <temEnd + 1 ; i ++)// 途中のスペースを削除 23 { 24 if(s [i]!= ' ' ) 25 { 26 dealS [++ k] = s [i]; 27 } 28 else if(s [i] == ' ' ) 29 { 30 if(s [ i + 1 ] == ' ') // 連続スペース 31 継続; 32さ もなくば 33 取引[++ k] = ' ' ; 34 } 35 } 36 37 k = -1 ; 38 memset(s、0、len); // 清空S 39 のために(INT I = STRLEN(チェック!) - 1 ; I> = 0 ; i-- ) 40 { 41 ながら(チェック![I] =!' ' && I =! - 1 ) 42 { 43 ワード[++ l] = dealS [i]; 44 i-- ; 45 } 46 47 for(int j = l; j> = 0; j-- ) 48 { 49 s [++ k] = word [j]; 50 } 51 if(i!= 0) // 最後でない場合 52 { 53 s [++ k] = ' ' ; 54 } 55 memset(word、0、l + 1); // 空の単語 56 l = -1 ; 57 } 58 s [k] = ' \ 0 ' ; 59 returns; 60 }