题目
旧键盘上坏了几个键,于是在敲一段文字的时候,对应的字符就不会出现。现在给出应该输入的一段文字、以及实际被输入的文字,请你列出肯定坏掉的那些键。
输入格式:
输入在 2 行中分别给出应该输入的文字、以及实际被输入的文字。每段文字是不超过 80 个字符的串,由字母 A-Z(包括大、小写)、数字 0-9、以及下划线 _(代表空格)组成。题目保证 2 个字符串均非空。
输出格式:
按照发现顺序,在一行中输出坏掉的键。其中英文字母只输出大写,每个坏键只输出一次。题目保证至少有 1 个坏键。
输入样例:
7_This_is_a_test
_hs_s_a_es
输出样例:
7TI
分析
- 应该输入的文字设为s1,实际被输入的文字设为s2。
- 如果键没坏,那么在s1中出现的s2中一定会出现。找坏键,排除没坏的情况就可以了。但是要注意,结果里不能有重复的两个键。
- 方法1:在s2中遍历在s1中的每一个字符,如果相等则停止进行下一轮比较;如果直到s2结束都没找到相等的,再看结果字符串中之前是否已经存入这个键,如果没有则放入,否则舍弃。
- 方法2:使用string类的find函数以及c的tuopper函数,这个方法是柳神找到的。柳婼 の blog
- 本题由于字符个数较少,所以两种方法耗时差不多,但柳神姐姐的代码好简洁!系统提供了函数的一定要用系统的,因为一是方便而且代码简洁,二是官方给的函数效率一般都比我们自己写的要好,太香了。
AC代码
方法1代码
#include<iostream>
#include<string>
using namespace std;
int main()
{string s1,s2,result;int i,j,k,len1,len2;cin>>s1>>s2;len1=s1.length();len2=s2.length();for(i=0;i<len1;i++){for(j=0;j<len2;j++){if(s1[i]==s2[j])//如果s1中有字符在s2中出现,改键没有坏{break;}if(j==len2-1) {int flag=0;//作为本次比较中坏键之前是否已被记录的标志for(k=0;k<result.length();k++)//判断坏键是否已记录{if(s1[i]>='a'&&s1[i]<='z'){if(s1[i]-('a'-'A')==result[k]){flag=1;break;}}if(result[k]==s1[i]){flag=1;break;} }if(flag==0)//坏键且没有被记录过{if(s1[i]>='a'&&s1[i]<='z')//小写字母需要大写result+=s1[i]-('a'-'A');//ASCII码else //非小写字母直接记录result+=s1[i]; }}}}cout<<result;return 0;
}
方法2代码
#include <iostream>
#include <cctype>
using namespace std;
int main() {string s1, s2, ans;cin >> s1 >> s2;for (int i = 0; i < s1.length(); i++)if (s2.find(s1[i]) == string::npos && ans.find(toupper(s1[i])) == string::npos)ans += toupper(s1[i]);cout << ans;return 0;
}
方法2注解
- find函数:多种重载,本处使用的是
- size_type find(const char ch, size_type pos = 0) const,从字符串的pos位置开始,查找字符ch。如果找到,则返回该字符首次出现的位置;否则,返回string::npos。
- size_type:是用来描述string或者vector等容器长度的数据类型,一般认为是unsigned int。
- string::npos的值不同机器可能有差异,我的机器(64位)测试:是unsigned long的最大值:18446744073709551615
- int toupper(int c):如果 c 有相对应的大写字母,则该函数返回 c 的大写字母,否则返回c本身。返回值是一个可被隐式转换为 char 类型的 int 值。
方法2参考:
1029. 旧键盘(20)-PAT乙级真题
更多题解
pat 乙级(Basic Level) 题解汇总(持续更新)(C++)