929. 独特的电子邮件地址

146 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第11天,点击查看活动详情

前言

Hello!

非常感谢您阅读海轰的文章,倘若文中有错误的地方,欢迎您指出~  

自我介绍 ଘ(੭ˊᵕˋ)੭

昵称:海轰

标签:程序猿|C++选手|学生

简介:因C语言结识编程,随后转入计算机专业,获得过国家奖学金,有幸在竞赛中拿过一些国奖、省奖...已保研。

学习经验:扎实基础 + 多做笔记 + 多敲代码 + 多思考 + 学好英语!  

唯有努力💪  

知其然 知其所以然!

本文只记录感兴趣的部分

每日一题

929. 独特的电子邮件地址

每个 有效电子邮件地址 都由一个 本地名 和一个 域名 组成,以 '@' 符号分隔。除小写字母之外,电子邮件地址还可以含有一个或多个 '.' 或 '+' 。

  • 例如,在 alice@leetcode.com中, alice 是 本地名 ,而 leetcode.com 是 域名 。

如果在电子邮件地址的 本地名 部分中的某些字符之间添加句点('.'),则发往那里的邮件将会转发到本地名中没有点的同一地址。请注意,此规则 不适用于域名 。

如果在 本地名 中添加加号('+'),则会忽略第一个加号后面的所有内容。这允许过滤某些电子邮件。同样,此规则 不适用于域名 。

可以同时使用这两个规则。

给你一个字符串数组 emails,我们会向每个 emails[i] 发送一封电子邮件。返回实际收到邮件的不同地址数目。

image.png

模拟

使用简单模拟

扫描每一个邮件

逐一进行简化

然后再利用unordered_set进行计数

class Solution {
public:
    string func(string email) {
        bool flag = 0;
        bool flag2 = 0;
        string ans;
        for(int i = 0; i < email.length(); ++i) {
            if(email[i] == '@') {
                flag2 = 0;
                ans += email[i];
            } 
            if(flag2 == 1) {
                continue;
            }
            if(flag == 0) {
                if(email[i] == '.') {
                    continue;
                } else if(email[i] == '@') {
                    flag = 1;
                    flag2 = 0;
                    continue;
                } else if(email[i] == '+') {
                    flag2 = 1;
                    continue;
                } else {
                    ans += email[i];
                }
            } else {
                ans += email[i];
            }
        }
        return ans;
    } 
    int numUniqueEmails(vector<string>& emails) {
        unordered_set<string> us;
        for(int i = 0; i < emails.size(); ++i) {
                us.insert(func(emails[i]));
        }
        for(auto i : us) {
            cout << i << endl;
        }
        return us.size();
    }
};

官方题解

class Solution {
public:
    int numUniqueEmails(vector<string>& emails) {
        unordered_set<string> us;
        for(string email : emails) {
            string local;
            for(char c : email) {
                if(c == '+' || c == '@') {
                    break;
                } 
                if(c != '.') {
                    local += c;
                }
            }
            us.insert(local + email.substr(email.find('@')));
        }
        return us.size();
    }
};

思路是一样的

但是官方题解更简洁、清楚

自己还是没有学到家

  • 对于@后面的字母直接提取出来
  • 一旦遇到+或者@则终止遍历字符串
  • 其他只要不是. 就可以继续遍历,遇到.就跳过

结语

文章仅作为个人学习笔记记录,记录从0到1的一个过程

希望对您有一点点帮助,如有错误欢迎小伙伴指正

在这里插入图片描述