PAT Basic 1033. 舊鍵盤打字(20)(C語言實現)
阿新 • • 發佈:2019-02-08
, CSDN內容暫時不更新(將來有計劃更新), 請前往連結檢視最新內容. 歡迎star 我的repo
題目舊鍵盤上壞了幾個鍵,於是在敲一段文字的時候,對應的字元就不會出現。現在給出應該輸入的一段文字、以及壞掉的那些鍵,打出的結果文字會是怎樣?
輸入格式:
輸入在2行中分別給出壞掉的那些鍵、以及應該輸入的文字。其中對應英文字母的壞鍵以大寫給出;每段文字是不超過10^5個字元的串。可用的字元包括字母[a-z, A-Z]、數字0-9、以及下劃線“_”(代表空格)、“,”、“.”、“-”、“+”(代表上檔鍵)。題目保證第2行輸入的文字串非空。
注意:如果上檔鍵壞掉了,那麼大寫的英文字母無法被打出。
輸出格式:
在一行中輸出能夠被打出的結果文字。如果沒有一個字元能被打出,則輸出空行。
輸入樣例:
7+IE.
7_This_is_a_test.
輸出樣例:
_hs_s_a_tst
思路
這道就是1029題的逆向版,然後複雜了點而已。(但是程式碼更少了是什麼鬼)
- 讀取:在記錄壞鍵的時候很多種鍵,但是都是ASCII字元,因此用一個int[128]陣列記錄就好了,一視同仁,簡單粗暴。
- 輸出:第二行是不會有'+'符號的,因此除了大寫字母要特殊判斷,只要這個鍵沒有壞(陣列沒有記錄),不管是哪一類符號,輸出就行了。
- 使用邊讀取邊處理的方式,空間佔用降到最低。
toupper
函式對非字母字元會返回引數本身,因此記錄/查詢的時候不必區分字元型別,全都轉換成大寫。
這種方法比有多少種字元就建立多大的陣列去記錄要方便的多,程式碼量極少。
注意:第一行可能為空,使用scanf這樣跳過空白字元的函式就不行了。我一開始就用的逐字元讀取的方法,每次讀到換行,一直都沒有發覺這一點……
程式碼
#include <stdio.h> #include <ctype.h> int main() { char c; int bad[128] = {0}; /* record keys are broken or not */ while((c = getchar()) != '\n') /* read broken keys */ bad[toupper(c)] = 1; while((c = getchar()) != '\n') /* read string and print */ if(!bad[toupper(c)] && !(isupper(c) && bad['+'])) putchar(c); return 0; }