PAT乙級真題1029 || 舊鍵盤(詳解,C/C++示例锈津,測試點分析)


【歡迎關(guān)注微信公眾號:計算機(jī)黑科學(xué)大全呀酸,對話框回復(fù):PAT乙級真題】獲取全部真題詳解及代碼示例
個人博客地址https://mzwang.top

舊鍵盤

題目描述:

舊鍵盤上壞了幾個鍵,于是在敲一段文字的時候琼梆,對應(yīng)的字符就不會出現(xiàn)⌒杂現(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

題目來源:PAT乙級1029
作者:CHEN, Yue
單位:浙江大學(xué)

問題解決:

解題思想

本題設(shè)置了一個標(biāo)記數(shù)組str_hash[]衙耕,將字符0-9散列到數(shù)組str_hash[]下標(biāo)0-9昧穿,將字符A-Z或a-z散列到數(shù)組str_hash[]下標(biāo)10-35,對于散列之后對應(yīng)的下標(biāo)ha橙喘,str_hash[ha]為0表示散列前對應(yīng)的字符還未輸出时鸵;str_hash[ha]為1表示散列前對應(yīng)的字符已經(jīng)輸出,就不再重復(fù)輸出厅瞎;將下劃線單獨處理饰潜。注意下標(biāo)的移動問題,若a[i] != b[j]和簸,則a[i]一定是壞鍵彭雾,此時只需將i后移一位;若a[i] = b[j]锁保,則a[i]不是壞鍵薯酝,此時i與j都需要后移一位。由于某一字母是壞鍵時(無論大寫還是小寫字母)只需輸出大寫字母爽柒,只需將小寫字母轉(zhuǎn)換成大寫字母吴菠,然后再進(jìn)行散列即可。

易錯提醒

示例代碼中霉赡,若將第13行的while循環(huán)判斷條件改成:

while(a[i] != '\0'&&b[j] != '\0')

將導(dǎo)致最后一個測試點不通過橄务,因為實際輸入的文字串結(jié)束而應(yīng)該輸入的文字串未結(jié)束時,應(yīng)該輸入的文字串后面可能還會有一些壞鍵穴亏,由于循環(huán)已經(jīng)退出蜂挪,它們將不能輸出重挑,從而導(dǎo)致錯誤。

若將第37行的i后移去掉棠涮,改成如下形式代碼(i后移放到每一判斷條件內(nèi)部):

#include <cstdio>
#define MAXN 81
using namespace std;
int main()
{
    char a[MAXN],b[MAXN];   //a[]為應(yīng)該輸入的文字谬哀,b[]為實際輸入的文字
    int str_hash[36] = {0};    //通過散列的方式標(biāo)記某一壞掉的鍵是否已輸出
    int flag = 1;   //單獨標(biāo)記下劃線是否已輸出(若下劃線為壞掉的鍵)
    scanf("%s",a);    //輸入應(yīng)該輸入的文字
    getchar();  //吸收掉換行
    scanf("%s",b);    //輸入實際輸入的文字
    int i = 0,j = 0;
    while(a[i] != '\0'){  //注意此處的條件
        if(a[i] != b[j]){
            if(flag&&a[i] == '_'){  //'_'為壞鍵且還未輸出
                printf("_");
                flag = 0;   //標(biāo)記'_'已輸出
                i++;    //應(yīng)輸入文字串的下標(biāo)后移一位
            }
            else if((a[i] >= 'a'&&a[i] <= 'z')
                    ||(a[i] >= 'A'&&a[i] <= 'Z')){  //小寫或大寫字母
                if(a[i] >= 'a'&&a[i] <= 'z'){   //若為小寫字母
                    a[i] -= 32; //轉(zhuǎn)換成大寫字母
                }
                int ha = a[i] - 55; //散列,'A'散列對應(yīng)下標(biāo)10
                if(str_hash[ha] == 0){  //之前未輸出過
                    printf("%c",a[i]);
                    str_hash[ha] = 1;   //輸出后標(biāo)記為1
                }
                i++;    //應(yīng)輸入文字串的下標(biāo)后移一位
            }
            else if(a[i] >= '0'&&a[i] <= '9'){  //若為數(shù)字
                int ha = a[i] - '0';
                if(str_hash[ha] == 0){  //之前未輸出過
                    printf("%c",a[i]);
                    str_hash[ha] = 1;   //輸出后標(biāo)記為1
                }
                i++;    //應(yīng)輸入文字串的下標(biāo)后移一位
            }
        }
        else{   //兩文字串對應(yīng)位置字符相同時严肪,則下標(biāo)同時后移一位
            i++;
            j++;
        }
    }
    return 0;
}

將i++改至第18史煎,30及38行的位置,將導(dǎo)致倒數(shù)第二個測試點超時驳糯,因為一旦壞鍵為_且已輸出篇梭,再次遇到時將不能進(jìn)入判斷條件內(nèi)部,從而導(dǎo)致i不能得到更新酝枢,陷入死循環(huán)恬偷。

代碼示例(C/C++)

小提示:請將以下代碼保存為.cpp格式(C++程序)左右滑動代碼以查看完整代碼

#include <cstdio>
#define MAXN 81
using namespace std;
int main()
{
    char a[MAXN],b[MAXN];   //a[]為應(yīng)該輸入的文字,b[]為實際輸入的文字
    int str_hash[36] = {0};    //通過散列的方式標(biāo)記某一壞掉的鍵是否已輸出
    int flag = 1;   //單獨標(biāo)記下劃線是否已輸出(若下劃線為壞掉的鍵)
    scanf("%s",a);    //輸入應(yīng)該輸入的文字
    getchar();  //吸收掉換行
    scanf("%s",b);    //輸入實際輸入的文字
    int i = 0,j = 0;
    while(a[i] != '\0'){  //注意此處的條件
        if(a[i] != b[j]){
            if(flag&&a[i] == '_'){  //'_'為壞鍵且還未輸出
                printf("_");
                flag = 0;   //標(biāo)記'_'已輸出
            }
            else if((a[i] >= 'a'&&a[i] <= 'z')
                    ||(a[i] >= 'A'&&a[i] <= 'Z')){  //小寫或大寫字母
                if(a[i] >= 'a'&&a[i] <= 'z'){   //若為小寫字母
                    a[i] -= 32; //轉(zhuǎn)換成大寫字母
                }
                int ha = a[i] - 55; //散列帘睦,'A'散列對應(yīng)下標(biāo)10
                if(str_hash[ha] == 0){  //之前未輸出過
                    printf("%c",a[i]);
                    str_hash[ha] = 1;   //輸出后標(biāo)記為1
                }
            }
            else if(a[i] >= '0'&&a[i] <= '9'){  //若為數(shù)字
                int ha = a[i] - '0';
                if(str_hash[ha] == 0){  //之前未輸出過
                    printf("%c",a[i]);
                    str_hash[ha] = 1;   //輸出后標(biāo)記為1
                }
            }
            i++;    //應(yīng)輸入文字串的下標(biāo)后移一位
        }
        else{   //兩文字串對應(yīng)位置字符相同時袍患,則下標(biāo)同時后移一位
            i++;
            j++;
        }
    }
    return 0;
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市竣付,隨后出現(xiàn)的幾起案子诡延,更是在濱河造成了極大的恐慌,老刑警劉巖古胆,帶你破解...
    沈念sama閱讀 211,743評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件肆良,死亡現(xiàn)場離奇詭異,居然都是意外死亡赤兴,警方通過查閱死者的電腦和手機(jī)妖滔,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,296評論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來桶良,“玉大人座舍,你說我怎么就攤上這事≡煞” “怎么了曲秉?”我有些...
    開封第一講書人閱讀 157,285評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長疲牵。 經(jīng)常有香客問我承二,道長,這世上最難降的妖魔是什么纲爸? 我笑而不...
    開封第一講書人閱讀 56,485評論 1 283
  • 正文 為了忘掉前任亥鸠,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘负蚊。我一直安慰自己神妹,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 65,581評論 6 386
  • 文/花漫 我一把揭開白布家妆。 她就那樣靜靜地躺著鸵荠,像睡著了一般。 火紅的嫁衣襯著肌膚如雪伤极。 梳的紋絲不亂的頭發(fā)上蛹找,一...
    開封第一講書人閱讀 49,821評論 1 290
  • 那天,我揣著相機(jī)與錄音哨坪,去河邊找鬼庸疾。 笑死,一個胖子當(dāng)著我的面吹牛当编,可吹牛的內(nèi)容都是我干的彼硫。 我是一名探鬼主播,決...
    沈念sama閱讀 38,960評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼凌箕,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了词渤?” 一聲冷哼從身側(cè)響起牵舱,我...
    開封第一講書人閱讀 37,719評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎缺虐,沒想到半個月后芜壁,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,186評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡高氮,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,516評論 2 327
  • 正文 我和宋清朗相戀三年慧妄,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片剪芍。...
    茶點故事閱讀 38,650評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡塞淹,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出罪裹,到底是詐尸還是另有隱情饱普,我是刑警寧澤,帶...
    沈念sama閱讀 34,329評論 4 330
  • 正文 年R本政府宣布状共,位于F島的核電站套耕,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏峡继。R本人自食惡果不足惜冯袍,卻給世界環(huán)境...
    茶點故事閱讀 39,936評論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧康愤,春花似錦儡循、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,757評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至资盅,卻和暖如春调榄,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背呵扛。 一陣腳步聲響...
    開封第一講書人閱讀 31,991評論 1 266
  • 我被黑心中介騙來泰國打工每庆, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人今穿。 一個月前我還...
    沈念sama閱讀 46,370評論 2 360
  • 正文 我出身青樓缤灵,卻偏偏與公主長得像,于是被迫代替她去往敵國和親蓝晒。 傳聞我的和親對象是個殘疾皇子腮出,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,527評論 2 349

推薦閱讀更多精彩內(nèi)容