給定一句英語,要求你編寫程序,將句中所有單詞的順序顛倒輸出。
輸入格式:
測試輸入包含一個測試用例,在一行內給出總長度不超過 80 的字符串。字符串由若干單詞和若干空格組成,其中單詞是由英文字母(大小寫有區分)組成的字符串,單詞之間用 1 個空格分開,輸入保證句子末尾沒有多餘的空格。
輸出格式:
每個測試用例的輸出佔一行,輸出倒序後的句子。
輸入樣例:
Hello World Here I Come
輸出樣例:
Come I Here World Hello
常規思路:讀入字符串,從頭開始得到每一個單詞並儲存,然後逆序輸出即可
法一(參考“算法筆記”):由於本題是單點測試(即只有一組輸入數組),所以輸入會以EOF結尾。用scanf讀字符串,每次讀到空格即停止,此時都得到的就是一個單詞,將其儲存在二維數組中,再逆序輸出即可。本法雖然也是常規思路,但是利用了scanf的特點,更加簡潔了些
直接上代碼吧:
#include<cstdio>
using namespace std;
int main(){
int cnt = 0; //cnt爲讀入的單詞個數
char ans[80][80]; //二維數組ans儲存讀入的單詞
while(~scanf("%s", ans[cnt])) //判斷scanf返回值是否是EOF(即是否輸入完畢)
cnt++; //單詞個數+1
while (cnt--) //逆序輸出單詞
printf("%s%s", ans[cnt], cnt > 0 ? " " : ""); //最後一個單詞後無空格
return 0;
}
法二:“將計就計”,既然要逆序輸出字符串, 那麼我就從後往前看
思路:用gets一次性讀入整個字符串,倒着遍歷, 每次找到空格時,就輸出該空格後面的單詞,然後將這個單詞抹掉(巧妙之處:把該空格改爲結束符'\0'),直到遍歷到字符串頭。就像從後往前砍一根木棍,每次砍斷一截,直到砍完爲止,每次砍的刀痕就是'\0'。
下面是AC的代碼:
#include<stdio.h>
#include<string.h>
#define MAX 82
int main() {
int n, k, i;
char s[MAX];
gets(s); //讀入字符串
n = strlen(s); //得到字符串長度
char* p = s + n; //p指針開始時指向字符串尾('\0'的位置)
while (1) { //條件沒什麼好寫的,乾脆寫個1, 循環裏面有終止條件(自我喜好)
if (p == s) { //p == s說明到達了字符串頭,則終止循環
printf("%s\n", p); //輸出該單詞
break; //跳出循環
}
else if (*p == ' ' && *(p + 1) != ' ') { //找到空格,並且其後不是空格(即是單詞)
*p = '\0'; //把空格處換成結束符'\0'
printf("%s ", p + 1); //輸出該空格後面的單詞
}
p--; //倒着遍歷,指針向左移動一個
}
return 0;
}
//總結:自我認爲兩種方法都是非常巧妙的(不喜莫見怪啊!),但是感覺第二種方法更有技術性,更爲推薦