1. 程式人生 > >PAT乙級1033. 舊鍵盤打字(20)

PAT乙級1033. 舊鍵盤打字(20)

這題目我已開始用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