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.csdn.net/Dodd9199/article/details/50976750

猜你喜欢

转载自blog.csdn.net/qq_37205425/article/details/83783945
今日推荐