1029 旧键盘
1029 旧键盘 (20分)
旧键盘上坏了几个键,于是在敲一段文字的时候,对应的字符就不会出现。现在给出应该输入的一段文字、以及实际被输入的文字,请你列出肯定坏掉的那些键。
输入格式:
输入在 2 行中分别给出应该输入的文字、以及实际被输入的文字。每段文字是不超过 80 个字符的串,由字母 A-Z(包括大、小写)、数字 0-9、以及下划线 _
(代表空格)组成。题目保证 2 个字符串均非空。
输出格式:
按照发现顺序,在一行中输出坏掉的键。其中英文字母只输出大写,每个坏键只输出一次。题目保证至少有 1 个坏键。
输入样例:
7_This_is_a_test
_hs_s_a_es
输出样例:
7TI
这道题是比较简单的,但是要注意一个坑点,就是实际输入的字符串s2遍历到末尾结束了而应该输入的字符串s1可能还没遍历到末尾,s1后面可能还会有一些坏键,
所以要处理好这种情况,附上代码
1 #include<iostream> 2 #include<string> 3 using namespace std; 4 int main() 5 { 6 int flag[96]={0}; //flag初始化为0;代表坏掉的键还没输出;A、Z、'_'的码值分别是65、90、95 7 string s1,s2; 8 cin>>s1>>s2; 9 for(int i=0,j=0;i<s1.length();) { 10 if(s1[i]!=s2[j]) { //输出坏掉的键 11 if('a'<=s1[i]&&s1[i]<='z') //如果是小写,就转换成对应的大写 12 s1[i]=s1[i]-32; 13 if(flag[(int)s1[i]]==0) { //坏掉的键还没输出 14 cout<<s1[i]; 15 flag[(int)s1[i]]=1; 16 } 17 i++; 18 } 19 else { 20 if(j==s2.length()-1) //s2到了末尾,只需要递增i即可,直至i到末尾 21 i++; 22 else{ 23 i++; 24 j++; 25 } 26 } 27 } 28 return 0; 29 }
注意,第9行for(int i=0,j=0;i<s1.length(); 这条语句不能写成 for(int i=0,j=0;i<s1.length()&&j<s2.length();) 因为最后一个测试点通不过,就比如下面的这组数据就通不过,
原因很简单,因为实际输入的字符串s2遍历到末尾结束了而应该输入的字符串s1可能还没遍历到末尾,s1后面可能还会有一些坏键,但是由于循环已经退出了,将导致他们不能输出,从而导致错误
可以测试一下下面的这个数据
7_This_is_a_tesc
_hs_s_a_es
ac了