PAT乙級 1029 舊鍵盤
阿新 • • 發佈:2018-11-08
舊鍵盤上壞了幾個鍵,於是在敲一段文字的時候,對應的字元就不會出現。現在給出應該輸入的一段文字、以及實際被輸入的文字,請你列出肯定壞掉的那些鍵。
輸入格式:
輸入在 2 行中分別給出應該輸入的文字、以及實際被輸入的文字。每段文字是不超過 80 個字元的串,由字母 A-Z(包括大、小寫)、數字 0-9、以及下劃線 _(代表空格)組成。題目保證 2 個字串均非空。
輸出格式:
按照發現順序,在一行中輸出壞掉的鍵。其中英文字母只輸出大寫,每個壞鍵只輸出一次。題目保證至少有 1 個壞鍵。
輸入樣例:
7_This_is_a_test
_hs_s_a_es
輸出樣例:
7TI
思路:
比對兩個字串的首字母,若不相同,記錄下正確字串中的字元並置標記為1,然後正確字串向後滑動;若相同,則同步向後滑動,直至到正確字串的末尾。遍歷記錄下來的壞鍵,將相同鍵位中除第一次出現之外的鍵標誌置0,最後輸出標誌為1的鍵位。
知識點補充:
C庫函式int toupper(int c)將小寫字母轉換為大寫,包含在標頭檔案ctype.h中返回值:該函式等效返回大寫字母C,如果存在這樣的值,否則c保持不變。返回值可以隱式轉換為char的int值。
程式碼:
#include<stdio.h> #include<string.h> #include<ctype.h> typedef struct{ char key; int sign; }broken_key; int main(){ broken_key L[81]; char right[81],wrong[81]; scanf("%s%s",right,wrong); int i=0,j=0,k=0; int len=strlen(right); while(i<len){ if(right[i]!=wrong[j]){ L[k].key=toupper(right[i++]); L[k++].sign=1; } else{ ++i,++j; } } for(i=0;i<k;++i){ if(L[i].sign==1){ for(j=i+1;j<k;++j){ if(L[j].key==L[i].key){ L[j].sign=0; } } } } for(i=0;i<k;++i){ if(L[i].sign!=0){ printf("%c",L[i].key); } } return 0; }
看到一個非常巧妙的解法,這裡是地址: https://blog.csdn.net/Dodd9199/article/details/50976750