题目:旧键盘
题目描述
旧键盘上坏了几个键,于是在敲一段文字的时候,对应的字符就不会出现。现在给出应该输入的一段文字、以及实际被输入的文字,请你列出肯定坏掉的那些键。
输入描述:
输入在2行中分别给出应该输入的文字、以及实际被输入的文字。每段文字是不超过80个字符的串,由字母A-Z(包括大、小写)、数字0-9、以及下划线“_”(代表空格)组成。题目保证2个字符串均非空。
输出描述:
按照发现顺序,在一行中输出坏掉的键。其中英文字母只输出大写,每个坏键只输出一次。题目保证至少有1个坏键。
输入例子:
7_This_is_a_test
_hs_s_a_es
输出例子:
7TI
解题思路1:
本题大意是对比第一个和第二个字符串,从而判断出哪些字符串是第一个具有而第二个不具备的。本题和一般的字符串比对题目不同的地方在于,本题串1和串2的输入是两者的字符具备相同先后顺序的,因此我们可以使用双指针的方法(为了便于比较,先定义函数,用for循环将两串大写英文字符全部转为小写),定义两个指针i和j,分别从0开始遍历,依次对比串1和串2两者指针所指向字符是否有区别,存在区别则记载串1中字符,并递增i;当前指针指向字符相同则说明该字符键没坏,则同时递增i和j,直至遍历完串1或串2(此处不能只遍历完串2,因为串2可能会存在字符是串1中不曾存在的字符键,但我们无需记载串2中单独存在字符)。注意,若遍历完成,还需查询串1是否全部遍历,若未曾全部遍历,则说明剩下的全部为缺省键,需记载。最后,按存储顺序输出缺省字符,并定义bool数组,用于记载某字符是否输出过(题意规定每个字符只需输出一次)。
代码:
#include <iostream>
#include <string>
using namespace std;
const int N = 300;
char Key[N]; //存储缺省字符键
bool flag[N]; //记载是否输出某字符
//英文串转小写
void transabc(string& str) {
for(int i = 0; i < str.size(); i++) {
if(str[i] >= 'A' && str[i] <= 'Z') str[i] = str[i] - 'A' + 'a';
}
}
int main() {
string Str1, Str2;
getline(cin, Str1); //输入数据,getline整行输入
getline(cin, Str2);
//将两串大写英文转为小写
transabc(Str1);
transabc(Str2);
int cnt = 0; //存储字符索引
int i, j;
//双指针遍历两个字符串,通过对比字符串可知缺少哪些按键
for(i = 0, j = 0; j < Str2.size() && i < Str1.size(); ) {
//其他字符两串相等,一同向后递增
if(Str1[i] == Str2[j]) {
i++, j++;
}
//不相等,说明缺省,记录按键,并递增i
else {
Key[cnt++] = Str1[i];
//cout << Str1[i];
i++;
}
}
//如果串1还存在没有遍历完的数
//这些数均为缺省键
while(i < Str1.size()) {
Key[cnt++] = Str1[i];
i++;
}
//输出数据
for(int i = 0; i < cnt; i++) {
//如果存在按键未曾输出,则输出,并记载输出记录
if(!flag[int(Key[i])]) {
//英文字母
if(Key[i] >= 'a' && Key[i] <= 'z') cout << char(Key[i] - 'a' + 'A');
else cout << char(Key[i]);
flag[int(Key[i])] = true;
}
}
return 0;
}