PAT乙級 1009 說反話 (20分) (題目 + 代碼 + 詳細註釋 + 兩種方法實現)

給定一句英語,要求你編寫程序,將句中所有單詞的順序顛倒輸出。

輸入格式:

測試輸入包含一個測試用例,在一行內給出總長度不超過 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;
}

//總結:自我認爲兩種方法都是非常巧妙的(不喜莫見怪啊!),但是感覺第二種方法更有技術性,更爲推薦

發佈了68 篇原創文章 · 獲贊 73 · 訪問量 7928
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章