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了

原文地址:https://www.cnblogs.com/buanxu/p/12813427.html