pat乙级 1029 旧键盘 (20 分)

本文介绍了一道编程题,旨在通过对比两段文本找出损坏的键盘键位。利用字符串遍历思想,结合toupper()函数简化代码,巧妙地解决了问题。

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

输入格式:
输入在 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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值