20200605做题整理
PAT乙真题,两道题目类似的,一起做了。
T1-旧键盘打字
链接:https://www.nowcoder.com/questionTerminal/8e89aa5561514b478c5ef50f2e66e76c
来源:牛客网
输入描述:
输入在2行中分别给出坏掉的那些键、以及应该输入的文字。其中对应英文字母的坏键以大写给出;每段文字是不超过10^5个字符的串。可用的字符包括字母[a-z, A-Z]、数字0-9、以及下划线“_”(代表空格)、“,”、“.”、“-”、“+”(代表上档键)。题目保证第2行输入的文字串非空。
注意:如果上档键坏掉了,那么大写的英文字母无法被打出。
输出描述:
在一行中输出能够被打出的结果文字。如果没有一个字符能被打出,则输出空行。
示例1
输入
7+IE.
7_This_is_a_test.
输出
_hs_s_a_tst
//思路:笨办法
//逐个对比待输入字符串和坏例
#include<stdio.h>
#include<string.h> //主要利用strlen
#define MAXSIZE 100001
int main(void){
char bad[MAXSIZE];
char s[MAXSIZE];
int i=0,j=0;
int flag=1; //定义输出标志,为假则不输出
//获取字符串
gets(bad);
gets(s);
int len1=strlen(bad);
int len2=strlen(s);
//逐个对比
for(i=0;i<len2;i++){
for(j=0;j<len1;j++){
if(s[i]==bad[j]||((bad[j]=='+')&&(s[i]>='A')&&(s[i]<='Z'))||(s[i]==(bad[j]-32)&&(s[i]>='A')&&(s[i]<='Z'))||(s[i]==(bad[j]+32)&&(s[i]>='a')&&(s[i]<='z'))){
flag=0; //有坏键则标记0,跳出本循环
break;
}
}
if(flag){
printf("%c",s[i]);
}
flag=1;
}
printf("\n");
return 0;
}
小结:
判定条件写的有点长,主要是当‘,’(半角逗号)的坑,‘,’+32=‘U’,所以最开始判定条件写值相差32的时候误判了,不得不加强了限制条件。
T2
链接:https://www.nowcoder.com/questionTerminal/f88dafac00c8431fa363cd85a37c2d5e
来源:牛客网
输入描述:
输入在2行中分别给出应该输入的文字、以及实际被输入的文字。每段文字是不超过80个字符的串,由字母A-Z(包括大、小写)、数字0-9、
以及下划线“_”(代表空格)组成。题目保证2个字符串均非空。
输出描述:
按照发现顺序,在一行中输出坏掉的键。其中英文字母只输出大写,每个坏键只输出一次。题目保证至少有1个坏键。
示例1
输入
7_This_is_a_test
_hs_s_a_es
输出
7TI
//思路:仍然是暴力破解
//设置一个坏键的集合
//s1&bad无同则s1&s2同则s1+1
//s1&s2同则s1+1 s2+1
//回到第一步
//s1&s2不同则bad添加新元素且s1+1
//回到第一步
#include<stdio.h>
#include<string.h>
#define MAXSIZE 81
int ScanBad(char s1,char s2[],int cnt); //自定义检索是否坏键的函数
int main(void){
char s1[MAXSIZE];
char s2[MAXSIZE];
char bad[MAXSIZE];
int i,j,k=0; //k是s2的检索下标
int cnt=0;
gets(s1);
gets(s2);
int len1=strlen(s1);
int len2=strlen(s2);
for(i=0;i<len1;i++){
if(!ScanBad(s1[i],bad,cnt)){ //判定s是否是当前已知坏键
if(s1[i]!=s2[k]){
bad[cnt]=s1[i]; //新坏键
cnt++;
}else{
k++;
}
}
}
for(i=0;i<cnt;i++){ //小写改成大写
if(bad[i]<='z'&&bad[i]>='a')
bad[i]-=32;
}
for(i=0;i<cnt;i++)
printf("%c",bad[i]);
printf("\n");
return 0;
}
int ScanBad(char s1,char s2[],int cnt){
int i;
for(i=0;i<cnt;i++){
if(s1==s2[i]||(s1<='z'&&s1>='a'&&s1==(s2[i]+32))||(s1<='Z'&&s1>='A'&&s1==(s2[i]-32)))
return 1;
}
return 0;
}
小结:
限制比上一题少,写起来稍微更方便一点。
总结
1.小错误太多,括号也会打错,准确率不够高,编译错误有点多,要命。还是不熟悉的缘故,要多刷题多看书。
2.中间出了几个段错误,大概可能是循环条件没有控制好,还是要写常规的写法。
3.gets(char *s)直接获得字符串(但是可能超出长度限制,用fgets(char *s, int n, FILE *stream)可能会好一点)(本题已给定MaxSize就不考虑长度限制的问题了)
4.要好好学习,多多刷题。