20200605整理

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.要好好学习,多多刷题。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值