题目 A1084
-
题意
根据输入的两个字符串判断输出坏掉的键,不用重复输出,字母用大写输出。 -
思路
用原始串扫描输出串,不相同的字符即为坏掉的键,输出时需判断之前是否已记录过,这里我采取map
的方法做映射。
注意:
可能扫描完了输出串,原始串后部分还未判断。 -
Code in C++
#include <cctype>
#include <cstdio>
#include <map>
#define maxn 85
int main()
{
char origin[maxn], out[maxn];
scanf("%s", origin);
scanf("%s", out);
std::map<char, int> worn;
int i, j;
for (i = 0, j = 0; origin[i] != '\0' && out[j] != '\0'; ++i) {
if (origin[i] != out[j]) {
char tmp = origin[i];
if (isalpha(tmp)) {
tmp = toupper (tmp);
}
if (worn.count(tmp)== 0) {
printf("%c", tmp);
worn[tmp] = 1;
}
} else {
++j;
}
}
// 判断原串最后一位
for (; origin[i] != '\0'; ++i) {
char tmp = origin[i];
if (isalpha(tmp)) {
tmp = toupper (tmp);
}
if (worn.count(tmp)== 0) {
printf("%c", tmp);
worn[tmp] = 1;
}
}
return 0;
}
题目 B1033 旧键盘打字
-
题意
给出坏掉的键和原始串,输出显示的串。 -
思路
这里其实主要就是记住坏掉的键和关于大写字母输出的逻辑即可。坏掉键中的大写字母都换为小写字母(不换将输入串的小写变大写再判断也可以)。
注意:
坏掉的键可能输入很长也可能为空,也需要用长串变量接收,采取getline
方式。最后需要输出空行。 -
Code in C++
#include <cstdio>
#include <cstring>
#include <iostream>
#include <string>
bool hashTable[256];
std::string str;
int main()
{
memset(hashTable, true, sizeof(hashTable));
getline(std::cin, str);
for (int i = 0; i < str.size(); ++i) {
if (str[i] >= 'A' && str[i] <= 'Z')
str[i] = str[i] - 'A' + 'a';
hashTable[str[i]] = false;
}
getline(std::cin, str);
for (int i = 0; i < str.size(); ++i) {
if (str[i] >= 'A' && str[i] <= 'Z') {
char tmp = str[i] - 'A' + 'a';
if (hashTable[tmp] == true && hashTable['+'] == true ) {
printf("%c", str[i]);
}
} else if (hashTable[str[i]] == true){
printf("%c", str[i]);
}
}
printf("\n");
return 0;
}
小结
字符串的输入方式还是没有掌握地很好。然后就是题目中的一些细节没有掌握还有一些逻辑写错了地方导致debug了很久。