PAT B1029 旧键盘 (20分)

刚刚还在想,昨天我肝了两篇文章,今天还肝不肝了。。。但是今天既然也已经刷题了,不肝一篇文章都对不起自己。废话不哆嗦,走起。。。--2020.6.3
万万没想到系统维护,被迫断更。我脸已肿--2020.6.4


被迫断更

背景

旧键盘上坏了几个键,于是在敲一段文字的时候,对应的字符就不会出现。现在给出应该输入的一段文字、以及实际被输入的文字,请你列出肯定坏掉的那些键。

输入格式:

输入在 2 行中分别给出应该输入的文字、以及实际被输入的文字。每段文字是不超过 80 个字符的串,由字母 A-Z(包括大、小写)、数字 0-9、以及下划线 _(代表空格)组成。题目保证 2 个字符串均非空。

输出格式:

按照发现顺序,在一行中输出坏掉的键。其中英文字母只输出大写,每个坏键只输出一次。题目保证至少有 1 个坏键。

输入样例:

7_This_is_a_test
_hs_s_a_es

输出样例:

7TI


之前我们做的是有关排序的题目,为了知识框架的完整性,我们跳过前面暂且还没有刷的排序,先看看这个


你可能会问我,为了这两个字为什么要插一张图片。还不是因为不支持一大批Markdown语法

散列题目我觉得相对来说,容易理解,也比较好写。


有关这道题,题目简短没什么废话,清晰明了。遵循传统,我还是要解释一下
意思是先是给你一行字符串,
然后再给你一行字符串,
看第一行里面的字符,谁没有在第二行出现
打印出他们(如果是字母打印大写的),一种只打印一次
木了~


#include 
#include 
#include 
#include 
using namespace std;
//所需的准备

string input;//存储题目里模拟的输入
string output;//存储题目里模拟的输出
bool hashTable[128] = {false};//128是采用ASCII码值,关于这个skill,课代表最后总结一下


int main()
{
    // freopen("write.in", "r", stdin);
    // freopen("ans.out", "w", stdout);
    // while (getline(cin, input))
    // {
//被注释掉的是我进行文件测试用的代码,我没删,需要的童鞋可以解绑他们
        getline(cin, input);
        getline(cin, output);//都读进来,没啥解释的
        
        int lenOfInput = input.length();
        int lenOfOutput = output.length();
        /*
        先搞到他们的长度,
        我们知道为了遍历一段数据的每一位的话,获取总长度一般来说是很必要的
        */


        /*
        Input是“原生字符串”,答案是从Input一个个筛出来的,自然依据Input遍历了
        */
        for (int i = 0; i < lenOfInput; i++)
        {
            int j;
            char tempOfInput;//这个temp,暂存Input的某一位,他的任务是和output每一位进行比较
            char tempOfOutput;//这个temp,暂存Output的某一位,它的更迭比tempofinput要快


            for (j = 0; j < lenOfOutput; j++) //  遍历output的每一位
            {
                tempOfInput = input[i];
                tempOfOutput = output[j];//得到某一位

                if (tempOfInput >= 'a' && tempOfInput <= 'z')
                {
                    tempOfInput -= 32;
                }
                if (tempOfOutput >= 'a' && tempOfOutput <= 'z')
                {
                    tempOfOutput -= 32;
                }//这里统一变成大写,既方便比较,也方便输出,ASCII差32


                if (tempOfInput == tempOfOutput)
                    break;
                /*
                如果input的temp,出现在output里面了,
                说明这个字母没问题,就不用循环接着在output找了
                */
            }
  

            /*
            要是我都找完了,也没在output里面找到当前  i  指定的字母,
            意味着此时j等于了lenofout
            */
            if (j == lenOfOutput && hashTable[tempOfInput] == false)
            //要是都找了没找到,并且该字母指定的hashtable是假,就值得输出。不是假说明输出过了
            {
                printf("%c", tempOfInput);
                hashTable[tempOfInput] = true;//输出过一次,就记录
            }
        }
    // }

    // fclose(stdin);
    // fclose(stdout);

    return 0;
}


这题的代码短小精悍,我个人认为是值得热身的一道小题,尤其这个把ASCII当数组下标的操作,值得记录学习。

课代表:

在标记普通的一些字符的时候,拿ASCII作为数组下标是很好的做法。/这应该属于基操,我却在煞有介事大加赞扬,战术呵呵~

顺便一提 ,我一直好奇ASCII的发音
我们大多数人都在念

“啊死氪码”

但是人家英语发音可是

“艾斯kii”呀

有音标有真相

我不能加音频,如果看了音标还不信的话,自己搜吧。

开始吟唱~~~

我的码云:这里有复制粘贴就能跑起来的,交上去就是满分的代码

时间不早了,如果我想起有什么值得一写的,就回来补充。
一般是没有什么是值得再补充的了,yeah

你可能感兴趣的:(PAT B1029 旧键盘 (20分))