傳送門
https://pintia.cn/problem-sets/994805260223102976/problems/994805292322111488
題目
舊鍵盤上壞了幾個鍵,于是在敲一段文字的時候,對應(yīng)的字符就不會出現(xiàn)?,F(xiàn)在給出應(yīng)該輸入的一段文字、以及實際被輸入的文字,請你列出肯定壞掉的那些鍵。
輸入格式:
輸入在2行中分別給出應(yīng)該輸入的文字、以及實際被輸入的文字。每段文字是不超過80個字符的串,由字母A-Z(包括大、小寫)、數(shù)字0-9、以及下劃線“_”(代表空格)組成。題目保證2個字符串均非空。
輸出格式:
按照發(fā)現(xiàn)順序,在一行中輸出壞掉的鍵。其中英文字母只輸出大寫,每個壞鍵只輸出一次。題目保證至少有1個壞鍵。
輸入樣例:
7_This_is_a_test
_hs_s_a_es
輸出樣例:
7TI
分析
1.首先聲明一個數(shù)組來記錄是否檢測過對應(yīng)的字符,注意,英文大寫字母和小寫字母用一個位置來檢測,小寫字母-32即為大寫字母。我這里用了三種狀態(tài):0為未判斷,1為未損壞,-1為已損壞。
2.然后根據(jù)輸入的第一個字符串遍歷第二個字符串,如果發(fā)現(xiàn)有未檢測的字符就進行檢測,若檢測后未找到就輸出該字符。
需要注意的是大小寫轉(zhuǎn)換的時機。
遇到的坑:
這里我用的是string.find方法,按書上說是如果找到,返回下標;如果未找到,返回-1,我在使用時發(fā)現(xiàn)一個問題:
cout << "12345".find("6") <<endl;
輸出的結(jié)果是4294967295,懷疑是find的返回類型默認是無符號整型,果然我在前面加上int轉(zhuǎn)換就是-1了。
cout << (int)"12345".find("6") <<endl;
結(jié)果是-1
源代碼
//C/C++實現(xiàn)
#include <iostream>
#include <string>
using namespace std;
//記錄每個按鍵是否損壞
//0為未判斷,1為未損壞,-1為已損壞
int isBroken[96];
int main(){
string s1, s2;
cin >> s1 >> s2;
for(int i = 0; i < s1.size(); ++i){
if(s1[i] >= '0' && s1[i] <= '9'){
if(isBroken[s1[i]] == 0){
if((int)s2.find(s1[i]) >= 0){
isBroken[s1[i]] = 1;
}
else{
isBroken[s1[i]] = -1;
printf("%c", s1[i]);
}
}
}
else if(s1[i] >= 'A' && s1[i] <= 'Z'){
if(isBroken[s1[i]] == 0){
if((int)s2.find(s1[i]) >= 0){
isBroken[s1[i]] = 1;
}
else{
isBroken[s1[i]] = -1;
printf("%c", s1[i]);
}
}
}
else if(s1[i] >= 'a' && s1[i] <= 'z'){
if(isBroken[s1[i] - 32] == 0){
if((int)s2.find(s1[i]) >= 0){
isBroken[s1[i] - 32] = 1;
}
else{
isBroken[s1[i] - 32] = -1;
printf("%c", s1[i] - 32);
}
}
}
else if(s1[i] == '_'){
if(isBroken['_'] == 0){
if((int)s2.find('_') >= 0){
isBroken['_'] = 1;
}
else{
isBroken['_'] = -1;
printf("%c", '_');
}
}
}
}
printf("%c", '\n');
return 0;
}