PAT乙级 1029 旧键盘
旧键盘上坏了几个键,于是在敲一段文字的时候,对应的字符就不会出现。现在给出应该输入的一段文字、以及实际被输入的文字,请你列出肯定坏掉的那些键。
输入格式:
输入在 2 行中分别给出应该输入的文字、以及实际被输入的文字。每段文字是不超过 80 个字符的串,由字母 A-Z(包括大、小写)、数字 0-9、以及下划线 _(代表空格)组成。题目保证 2 个字符串均非空。
输出格式:
按照发现顺序,在一行中输出坏掉的键。其中英文字母只输出大写,每个坏键只输出一次。题目保证至少有 1 个坏键。
输入样例:
7_This_is_a_test
_hs_s_a_es
输出样例:
7TI
思路:
比对两个字符串的首字母,若不相同,记录下正确字符串中的字符并置标记为1,然后正确字符串向后滑动;若相同,则同步向后滑动,直至到正确字符串的末尾。遍历记录下来的坏键,将相同键位中除第一次出现之外的键标志置0,最后输出标志为1的键位。
知识点补充:
C库函数int toupper(int c)将小写字母转换为大写,包含在头文件ctype.h中返回值:该函数等效返回大写字母C,如果存在这样的值,否则c保持不变。返回值可以隐式转换为char的int值。
代码:
#include<stdio.h>
#include<string.h>
#include<ctype.h>
typedef struct{
char key;
int sign;
}broken_key;
int main(){
broken_key L[81];
char right[81],wrong[81];
scanf("%s%s",right,wrong);
int i=0,j=0,k=0;
int len=strlen(right);
while(i<len){
if(right[i]!=wrong[j]){
L[k].key=toupper(right[i++]);
L[k++].sign=1;
}
else{
++i,++j;
}
}
for(i=0;i<k;++i){
if(L[i].sign==1){
for(j=i+1;j<k;++j){
if(L[j].key==L[i].key){
L[j].sign=0;
}
}
}
}
for(i=0;i<k;++i){
if(L[i].sign!=0){
printf("%c",L[i].key);
}
}
return 0;
}
看到一个非常巧妙的解法,这里是地址: https://blog.****.net/Dodd9199/article/details/50976750