Contents
  1. 1. 输入格式:
  2. 2. 输出格式:
  3. 3. 输入样例:
  4. 4. 输出样例:
  5. 5. 步骤:
  6. 6. 分析:
  7. 7. 代码:
  8. 8. 改进:

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

输入格式:

输入在 2 行中分别给出应该输入的文字、以及实际被输入的文字。每段文字是不超过 80 个字符的串,由字母 A-Z(包括大、小写)、数字 0-9、以及下划线 _(代表空格)组成。题目保证 2 个字符串均非空。

输出格式:

按照发现顺序,在一行中输出坏掉的键。其中英文字母只输出大写,每个坏键只输出一次。题目保证至少有 1 个坏键。

输入样例:

7_This_is_a_test
_hs_s_a_es

输出样例:

7TI

步骤:

(1)将完整的字符串s1和缺失的字符串s2中小写的字符都变为大写。

(2)判断s1[i]和s2[j]是否相等。若相等,i++,j++;若不相等,进入步骤(3)

(3)判断当前s1[i]中字符是否存在于集合set1中。若不存在,打印s1[i]并将s1[i]插入集合set1中。无论s1[i]是否存在于集合中,都i++。

(4)判断i是否越了s1的界,若越界,则结束;否则回到步骤(2)。

分析:

i和j分别指向s1和s2当前的下标位置,set1存储缺失的字符。

代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
#include<iostream>
#include<string>
#include<set>
using namespace std;
string Upper(string s){
for (int i=0;i<s.size();i++){
if (s[i] == '_') continue;
if (s[i] >= 'a' && s[i] <='z')
s[i] -= 32;
}
return s;
}
int main()
{
string s1,s2;
set<char> set1;
set<char>::iterator it;
int i,j;
cin >> s1 >> s2;
//将字符串都转换为大写
s1 = Upper(s1);
s2 = Upper(s2);
i=0,j=0;
while (i<s1.size()){
if (s1[i] == s2[j]){
i++;j++;
}
else{
//如果字符在集合中存在,it指向该元素在集合中的位置,否则it指向set1.end();
it = set1.find(s1[i]);
if (it == set1.end()){
cout << s1[i];
set1.insert(s1[i]);
}
i++;
}
}
return 0;
}

改进:

用字符串的find函数直接查找s1中的字符是否能在s2中和缺失字符串ans中查找到,如果在两者中都查找不到,则该字符是需要输出的。string::npos表示在字符串中没有匹配到相应的字符。

1
2
3
4
5
6
7
8
9
10
#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;
}
Contents
  1. 1. 输入格式:
  2. 2. 输出格式:
  3. 3. 输入样例:
  4. 4. 输出样例:
  5. 5. 步骤:
  6. 6. 分析:
  7. 7. 代码:
  8. 8. 改进: