PAT乙级 1029 旧键盘 (20 分)

版权声明:博主版权所有,未经允许,禁止转载!转载前请联系[email protected],谢谢合作,一起交流学习! https://blog.csdn.net/googlemzhang/article/details/90168010

旧键盘上坏了几个键,于是在敲一段文字的时候,对应的字符就不会出现。现在给出应该输入的一段文字、以及实际被输入的文字,请你列出肯定坏掉的那些键。

输入格式:
输入在 2 行中分别给出应该输入的文字、以及实际被输入的文字。每段文字是不超过 80 个字符的串,由字母 A-Z(包括大、小写)、数字 0-9、以及下划线 _(代表空格)组成。题目保证 2 个字符串均非空。

输出格式:
按照发现顺序,在一行中输出坏掉的键。其中英文字母只输出大写,每个坏键只输出一次。题目保证至少有 1 个坏键。

输入样例:
7_This_is_a_test
_hs_s_a_es
输出样例:
7TI

题目链接:https://pintia.cn/problem-sets/994805260223102976/problems/994805292322111488

思路:本题目还是降低了编程难度。将实际输入的字符串和原来的字符串进行一一比较,属于基本的字符串遍历思想。
(1)两个字符串中都有的字符无需保存,但是实际字符串中没有,而原来的字符串中含有的字符则要判断是否要保存(因为不能重复保存),那么进行一次循环即可解决。
(2)在判断当前缺少的字符是否已被保存,用到了一个库函数toupper进行判断,从而简化了代码,有一定的技巧性。
还有一点要注意的是,现在pat中不让使用gets()函数,提交时要注意下。
下面给出toupper()函数的代码实现和本题目完整代码

---------------------------
int toupper(int c)
{
	if ((c >= 'a') && (c <= 'z'))
		return c + ('A' - 'a');
	return c;
}
---------------------------

#include <bits/stdc++.h>
using namespace std;
const int maxn = 100;

int main()
{
	char str[maxn],tmp[maxn];
	char a[maxn];	//保存缺少的字符串	
	while(scanf("%s%s",str,tmp)==2)	
	{//str:好字符串,tmp:坏字符串 
		int len1 = strlen(str);
		int len2 = strlen(tmp);
		memset(a,0,sizeof(a));
		int k = 0;
		//step1:遍历,保存缺少的字符 
		for(int i=0,j=0;i<len1;++i)
		{
			if(j<len2&&str[i]==tmp[j])
			{//若相同,则无需保存 
				j++;
			}			 
			else	//保留坏的字符
			{
				int t=0;				
				for(t=0;t<k;++t)
				{//判断当前字符是否已保存 
					if(toupper(str[i])==toupper(a[t]))
					{//将小写字符转为大写字符比较 
						break;
					}
				}
				if(t==k)
				{//前面还没保留的字符 
					a[k++] = str[i];
				} 					 
			}
		}
		//step2:转为大写字符输出 
		for(int i=0;i<k;++i)
		{
			if(a[i]>='a'&&a[i]<='z')
			{//小写字符->大写字符 
				a[i] -= 32;	//转化为大写字符 
			}	
		}
		printf("%s\n",a);
		memset(str,0,sizeof(str));
		memset(tmp,0,sizeof(tmp));
	}	
	return 0;
}

猜你喜欢

转载自blog.csdn.net/googlemzhang/article/details/90168010
今日推荐