PAT乙級1033. 舊鍵盤打字(20)
阿新 • • 發佈:2019-01-10
這題目我已開始用10+26+5鍵盤的方式寫,但是第2個和第4個測試點一直過不掉
很煩,考慮到了第一行有可能為空的情況,但依然不行
自己修改了他的程式碼,一開始最後的一個測試點一直A不過,後來才突然發現A~Z的判斷很特殊的問題,不僅要考慮上檔鍵
貼出修改後的原始碼
#include <cstdio> #include <iostream> #include <cstring> using namespace std; bool BrokenKey[128]; //ASCII表上的字元 char s[10005];//錯字行,第一行 int main() { memset(BrokenKey,0,sizeof(BrokenKey)); memset(s,0,sizeof(s)); gets(s); for(int i = 0 ; s[i] ; ++i) { //分兩種情況處理 if(s[i] >= 'A' && s[i] <= 'Z') { BrokenKey[s[i]-'A'+'a'] = 1; } else { BrokenKey[s[i]] = 1; } } char c = 0; while(scanf("%c",&c) != EOF) { if(c >= 'A' && c <= 'Z' && BrokenKey[i]) { //當屬於A到Z時要特殊處理,因為判斷的物件和輸出的物件不同,幾次A不過都因為這個 if (BrokenKey['+']) continue; else if(!BrokenKey[c-'A'+'a']){ cout<<c; } } else if (!BrokenKey[c]) { cout<<c; } } return 0; }
順便貼上我錯誤的程式碼,寫的。。。。嗯。。
真的別罵我,希望有大神可以指出哪裡有問題。。。
//錯誤程式碼 #include <cstdio> #include <vector> #include <cstdlib> #include <iostream> #include <cstring> using namespace std; char WrongKey[150000],RightKey[150000]; int keyEnum[41]; //代表可輸入的鍵 0~9 a~z(包括大寫) , . - _ bool shift = 0; //上檔鍵 int main() { memset(keyEnum,0,sizeof(keyEnum)); memset(WrongKey,0,sizeof(WrongKey)); memset(RightKey,0,sizeof(RightKey)); //cin>>WrongKey>>RightKey; gets(WrongKey); gets(RightKey); int CacheLen = strlen(WrongKey); for(int i = 0 ; i < CacheLen ; ++i) { if(WrongKey[i] <= '9' && WrongKey[i] >= '0' ) { keyEnum[WrongKey[i]-'0'] = 1; } else if(WrongKey[i] >= 'a' && WrongKey[i] <= 'z' ) { keyEnum[WrongKey[i]-'a'+10] = 1; } else if(WrongKey[i] >= 'A' && WrongKey[i] <= 'Z' ) { keyEnum[WrongKey[i]-'A'+10] = 1; } else if(WrongKey[i] == ',') { keyEnum[36] = 1; } else if(WrongKey[i] == '.') { keyEnum[37] = 1; } else if(WrongKey[i] == '-') { keyEnum[38] = 1; } else if(WrongKey[i] == '_') { keyEnum[39] = 1; } else if(WrongKey[i] == '+') { shift = true; } } CacheLen = strlen(RightKey); int cnt = 0; for(int i = 0 ; i < CacheLen ; ++i) { if(shift && RightKey[i] <= 'A' && RightKey[i] >= 'Z') { } else if(RightKey[i] <= 'A' && RightKey[i] >= 'Z' ) { cnt++; if (!keyEnum[RightKey[i]-'A'+10] ) cout<<RightKey[i]; } else if(RightKey[i] <= '9' && RightKey[i] >= '0' ) { cnt++; if (!keyEnum[RightKey[i]-'0'] ) cout<<RightKey[i]; } else if(RightKey[i] >= 'a' && RightKey[i] <= 'z' ) { cnt++; if (!keyEnum[RightKey[i]-'a'+10] ) cout<<RightKey[i]; } else if(RightKey[i] == ',') { cnt++; if (!keyEnum[36] ) cout<<RightKey[i]; } else if(RightKey[i] == '.') { cnt++; if (!keyEnum[37] ) cout<<RightKey[i]; } else if(RightKey[i] == '-') { cnt++; if (!keyEnum[38] ) cout<<RightKey[i]; } else if(RightKey[i] == '_') { cnt++; if (!keyEnum[39]) cout<<RightKey[i]; } } if (!cnt) cout<<endl; return 0; }
原題地址:https://www.patest.cn/contests/pat-b-practise/1033
舊鍵盤上壞了幾個鍵,於是在敲一段文字的時候,對應的字元就不會出現。現在給出應該輸入的一段文字、以及壞掉的那些鍵,打出的結果文字會是怎樣?
輸入格式:
輸入在2行中分別給出壞掉的那些鍵、以及應該輸入的文字。其中對應英文字母的壞鍵以大寫給出;每段文字是不超過105個字元的串。可用的字元包括字母[a-z, A-Z]、數字0-9、以及下劃線“_”(代表空格)、“,”、“.”、“-”、“+”(代表上檔鍵)。題目保證第2行輸入的文字串非空。
注意:如果上檔鍵壞掉了,那麼大寫的英文字母無法被打出。
輸出格式:
在一行中輸出能夠被打出的結果文字。如果沒有一個字元能被打出,則輸出空行。
輸入樣例:7+IE. 7_This_is_a_test.輸出樣例:
_hs_s_a_tst