PAT-B 1029. 舊鍵盤(20)

傳送門

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;
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容