版权声明:博主版权所有,未经允许,禁止转载!转载前请联系[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;
}