L1-011记录

发布时间 2023-10-19 21:20:04作者: Arkiya

关于这道题目,今天其实有自己的一些思路 

L1-011 A-B
分数 20
作者 陈越
单位 浙江大学

本题要求你计算AB。不过麻烦的是,A和B都是字符串 —— 即从字符串A中把字符串B所包含的字符全删掉,剩下的字符组成的就是字符串AB。

输入格式:

输入在2行中先后给出字符串A和B。两字符串的长度都不超过104,并且保证每个字符串都是由可见的ASCII码和空白字符组成,最后以换行符结束。

输出格式:

在一行中打印出AB的结果字符串。

输入样例:

I love GPLT!  It's a fun game!
aeiou

输出样例:

I lv GPLT!  It's  fn gm!

不得不说,这位陈越老师的题目总是很 emm ***钻,而且很多都是看上去简单实际上技巧性强的很,关于这道题目,看到第一眼的想法是这样的
输入A/B两个字符串,遍历A,记录空格的位置在C,如果存在空格就把对应位置赋值为1,然后比较AB,如果相等就直接删除对应的位置,用双循环解决,但是这样做存在了一个问题
即 当我删除了对应的字符之后,会留下空格,因为我是直接把A的对应位置赋值为了空格,然后试图通过C的记录还原原本的字符串,但是这样做似乎并不行,还原的字符串格式与原本的不同
解决许久无果,因此转而看了大佬的代码,不得不让我感叹,大佬就是大佬
#include <iostream>
#include <string>
using namespace std;
int main()
{
    string a, s;
    getline(cin, a);
    getline(cin, s);
    int book[256];
    for (int i = 0; i < s.length(); i++)
    {
        book[s[i]] = 1;
    }
    for (int j = 0; j < a.length(); j++)
    {
        if (book[a[j]] == 1)
        {
            continue;
        }
        cout << a[j];
    }


}

这段代码的思路为,用一个book数组,先遍历要删除的字符串s,其中最精髓的是book[s[i]]这个式子,解释一下就是,假设我输入了aeiou,那么对于s[0]就是a

book[a]就是book[97],也就是说在这个位置标记为了1,这就相当于标记了a这个字母,然后在第二个循环中遍历,遍历原本的字符串a的时候,假设遇到了和s[0]一样的字母a,假设是 a[0],那么

book[a[0]]也是book[97],就会执行continue直接跳过,这样说可能不清楚,具体来说

I love GPLT! 

aeiou

先访问 I,发现book[a[0]] = book[a[I]],这个位置上是0,那么就会输出,然后访问空格,发现空格对应的位置也是0,输出,直到o,发现book[a[3]]=book[o]这个位置上是1

那么continue跳过,继续查找,这样做的好处是不需要再考虑空格的问题,因为空格压根没有被标记,原本在什么位置就会在什么位置输出

 

不得不感叹 大佬的思路又快又有效 自己还是个小菜鸡 要走的路还很远啊