📜  门| GATE CS 2021 |设置 2 |第 59 题(1)

📅  最后修改于: 2023-12-03 14:58:21.894000             🧑  作者: Mango

题目介绍

这是2021年GATE计算机科学工程考试的第二套试题第59题。该题目是关于使用数据结构实现一个简单的垃圾邮件过滤器。

题目描述

邮件过滤器是一个将电子邮件进行分类为垃圾邮件或非垃圾邮件的程序。使用哈希表来存储一些“垃圾邮件”关键词,当邮件中出现任意一个关键词,则认为该邮件是垃圾邮件。你需要实现这个过滤器,并解析一组邮件并输出每封邮件的分类。

输入格式

第一行输入包含一个整数 $t$,表示邮件的数量。

每个邮件由若干行组成,以单独的空白行结束。第一行包含一个整数 $n$,表示邮件的行数(排除开头和结尾的空白行)。接下来 $n$ 行是邮件的正文。

接下来 $t$ 行,每行为一个邮件。

输出格式

对于每个邮件,输出一行表示邮件是垃圾邮件还是非垃圾邮件,如果是垃圾邮件,则输出字符串“spam”,如果是非垃圾邮件,则输出字符串“not spam”。

注意:输出字符串必须全部小写。

示例

输入:

4
4
Buy viagra
Get rich quick
Loose weight fast
Money back guarantee
2
Hi Peter,
Just wanted to remind you about tomorrow's meeting.
Regards,
John
4
Discounts
Selling
Buy now
Limited offer
1
Hi Peter,
Are you free for lunch today?
Regards,
John

输出:

spam
not spam
spam
not spam

解题思路

该题目需要实现一个简单的垃圾邮件过滤器,主要思路就是使用哈希表来存储一些“垃圾邮件”关键词,当邮件中出现任意一个关键词,则认为该邮件是垃圾邮件。

在具体实现中,我们可以先将关键词存入一个哈希表中,再逐个读取邮件中的单词并判断是否为关键词。如果出现了一个关键词,则直接认为该邮件是垃圾邮件,否则认为是非垃圾邮件。

在实现过程中,我们还需要注意输入输出格式的处理,以及特殊字符的处理等问题。

参考代码

keywords = set(["buy", "viagra", "get", "rich", "quick", "loose", "weight", 
                "fast", "money", "back", "guarantee", "discounts", "selling", 
                "limited", "offer"])

def is_spam(mail):
    for line in mail.split("\n"):
        words = line.split()
        for word in words:
            if word.lower() in keywords:
                return True
    return False

num_mails = int(input().strip())

for i in range(num_mails):
    n = int(input().strip())
    mail = ""
    for j in range(n):
        mail += input().strip() + "\n"
    if is_spam(mail):
        print("spam")
    else:
        print("not spam")

在以上代码中,我们定义了一个集合 keywords,用于存储所有的关键词。接下来,我们实现了一个函数 is_spam,用于判断一封邮件是否为垃圾邮件。具体实现中,该函数逐个读取邮件中的每一行,并将每一行拆分为单词。如果单词是一个关键词,则直接认为该邮件是垃圾邮件,并返回 True。如果没有出现任何一个关键词,则认为该邮件是非垃圾邮件,并返回 False。

在主函数中,我们首先读取邮件的数量,并使用一个循环逐个处理每一封邮件。具体实现中,我们首先读取邮件正文的行数,并将正文按行拼接为一个字符串。然后,我们调用函数 is_spam,判断该邮件是否为垃圾邮件。最后,我们根据判断结果输出相应的字符串,表示该邮件是否为垃圾邮件。