PTA basic 1033 旧键盘打字 (20 分) c语言实现(gcc)
旧键盘上坏了几个键,于是在敲一段文字的时候,对应的字符就不会出现。现在给出应该输入的一段文字、以及坏掉的那些键,打出的结果文字会是怎样?
输入格式:
输入在 2 行中分别给出坏掉的那些键、以及应该输入的文字。其中对应英文字母的坏键以大写给出;每段文字是不超过 1 个字符的串。可用的字符包括字母 [a
-z
, A
-Z
]、数字 0
-9
、以及下划线 _
(代表空格)、,
、.
、-
、+
(代表上档键)。题目保证第 2 行输入的文字串非空。
注意:如果上档键坏掉了,那么大写的英文字母无法被打出。
输出格式:
在一行中输出能够被打出的结果文字。如果没有一个字符能被打出,则输出空行。
输入样例:
7+IE.
7_This_is_a_test.
输出样例:
_hs_s_a_tst
测试点4 测试用例 //坏键为大写字母时,需要同时屏蔽大小写的对应字母
7IE.
7_This_is_a_testSE.
1 //因为可以输入的字符有限,皆为ascii码,因此使用ascii码的int数值形成字典,用来记录字符是否可以输出 2 //用字典的下标来快速判断某个字符是否可以输出, 3 //如果'+'键坏掉了,那么a-z还是可以输出,但是A-Z的字符不能被输出,其他字符可以输出 测试点0 1 3 4 //如果a-z的某个字符键坏掉,那么大写小写的对应该字母都不应该出现,理应从可以输出的字典中剔除 测试点4 5 //初始数组的值都为0,然后将坏键对应下标的值置为1 6 //设置一个标志值,用来记录是否有字符输出,如果没有字符输出(即flag=0),则输出空行 测试点2 7 8 #include "stdio.h" 9 #include "stdlib.h" 10 #include "string.h" 11 12 int main(){ 13 int i=0,flag=0,j,alen,clen; 14 int arr[129]; 15 char availableList[100001],checkList[100001]; 16 char c; 17 memset(arr,0,sizeof(int)*129); 18 while((c=getchar())!='\n'){ 19 availableList[i]=c; 20 i++; 21 } 22 scanf("%s",checkList); 23 alen=strlen(availableList);//记录坏键的数量 24 clen=strlen(checkList);//待判定的字符串长度 25 if(alen){//无坏键时跳过 26 for(i=0;i<alen;i++){//循环判定,需要注意的是 坏键序列的字母只有大写,但是标记坏键的时候 大小写都需要标记 测试点4 27 c=availableList[i]; 28 if(c<='Z'&&c>='A'){ 29 arr[c-'A'+'a']=1; 30 arr[c]=1; 31 } 32 else if(c=='+'){//+键坏掉则屏蔽所有大写字母 33 for(j=(int)'A';j<(int)'A'+26;j++)arr[j]=1; 34 }else{ 35 arr[c]=1; 36 } 37 } 38 } 39 if(alen){//无坏键直接输出所有字符,有坏键进入循环判断是否可以输出 40 for(i=0;i<clen;i++){ 41 if(arr[(int)checkList[i]]==0){ 42 printf("%c",checkList[i]); 43 flag=1; 44 } 45 } 46 }else{ 47 printf("%s",checkList); 48 flag=1; 49 } 50 51 if(flag==0){ 52 printf("\n"); 53 }; 54 return 0; 55 }