持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第11天,点击查看活动详情
前言
Hello!
非常感谢您阅读海轰的文章,倘若文中有错误的地方,欢迎您指出~
自我介绍 ଘ(੭ˊᵕˋ)੭
昵称:海轰
标签:程序猿|C++选手|学生
简介:因C语言结识编程,随后转入计算机专业,获得过国家奖学金,有幸在竞赛中拿过一些国奖、省奖...已保研。
学习经验:扎实基础 + 多做笔记 + 多敲代码 + 多思考 + 学好英语!
唯有努力💪
知其然 知其所以然!
本文只记录感兴趣的部分
每日一题
929. 独特的电子邮件地址
每个 有效电子邮件地址 都由一个 本地名 和一个 域名 组成,以 '@' 符号分隔。除小写字母之外,电子邮件地址还可以含有一个或多个 '.' 或 '+' 。
- 例如,在 alice@leetcode.com中, alice 是 本地名 ,而 leetcode.com 是 域名 。
如果在电子邮件地址的 本地名 部分中的某些字符之间添加句点('.'),则发往那里的邮件将会转发到本地名中没有点的同一地址。请注意,此规则 不适用于域名 。
- 例如,"alice.z@leetcode.com” 和 “alicez@leetcode.com” 会转发到同一电子邮件地址。
如果在 本地名 中添加加号('+'),则会忽略第一个加号后面的所有内容。这允许过滤某些电子邮件。同样,此规则 不适用于域名 。
- 例如 m.y+name@email.com 将转发到 my@email.com。
可以同时使用这两个规则。
给你一个字符串数组 emails,我们会向每个 emails[i] 发送一封电子邮件。返回实际收到邮件的不同地址数目。
模拟
使用简单模拟
扫描每一个邮件
逐一进行简化
然后再利用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的一个过程
希望对您有一点点帮助,如有错误欢迎小伙伴指正