这是悦乐书的第356次更新,第383篇原创

01看题和准备

今天介绍的是LeetCode算法题中Easy级别的第218题(顺位题号是927)。每封电子邮件都包含本地名称和域名,以@符号分隔。

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

除了小写字母,这些电子邮件可能包含'.''+'

如果在电子邮件地址的本地名称部分中的某些字符之间添加句点('.'),则在那里发送的邮件将转发到本地名称中没有点的同一地址。例如,“alice.z@leetcode.com”“alicez@leetcode.com”转发到同一个电子邮件地址。(请注意,此规则不适用于域名。)

如果在本地名称中添加加号('+'),则会忽略第一个加号后面的所有内容。这允许过滤某些电子邮件,例如m.y+name@email.com将转发到my@email.com。(同样,此规则不适用于域名。)

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

给定电子邮件列表,我们会向列表中的每个地址发送一封电子邮件。有多少不同的地址实际接收邮件?例如:

输入:[“test.email+alex@leetcode.com”,“test.e.mail+bob.cathy@leetcode.com”,
“testemail+david@lee.tcode.com”]
输出:2
说明:“testemail@leetcode.com”和“testemail@lee.tcode.com”实际收到邮件

注意

  • 1 <= emails[i].length <= 100

  • 1 <= emails.length <= 100

  • 每封emails[i]都包含一个'@'字符。

  • 所有本地名称和域名都是非空的。

  • 本地名称不以“+”字符开头。

02 第一种解法

根据题目给的规则,对字符串分两段处理,在本地名称中,如果存在+号,就截取+号前的字符串,变成新的本地名称,如果遇到点号,就将点号全部替换,得到新的本地名称,再和域名部分拼接在一起,存入HashSet中,返回HashSetsize即可。

public int numUniqueEmails(String[] emails) {
Set<String> set = new HashSet<String>();
for (String email : emails) {
String tem = email;
int index = tem.indexOf('@');
// 截取@之前的字符串
tem = tem.substring(0, index);
// 有'+',就再截取'+'号之前的字符串
if (tem.indexOf('+') > 0) {
tem = tem.substring(0, tem.indexOf('+'));
}
// 将所有点号替换
tem = tem.replace(".", "");
// 将@符号前的新字符串和原字符串@符号后的域名拼接
// 存入HashSet
set.add(tem+email.substring(index));
}
return set.size();
}

03 第二种解法

我们也可以不使用字符串截取、替换等方法,直接对字符进行判断,然后拼接成新的email地址,最后存入HashSet中,返回HashSetsize即可。

public int numUniqueEmails2(String[] emails) {
Set<String> set = new HashSet<String>();
for (String email : emails) {
set.add(handleEmail(email));
}
return set.size();
} public String handleEmail(String email) {
StringBuilder sb = new StringBuilder();
int n = email.length();
// 是否遇到@符号
boolean flag = false;
for (int i=0; i<n; i++) {
char c = email.charAt(i);
if (!flag) {
//没遇到@符号前,遇到.号一律 跳过
if (c == '.') {
continue;
}
//遇到+号,往后跳一位,开始寻找@符号
if (c == '+') {
i++;
while (i < n && email.charAt(i) != '@') {
i++;
}
c = email.charAt(i);
// 已经遇到@符号
flag = true;
} else if(c == '@'){
// 没遇到+号,却遇到@符号了
flag = true;
}
}
sb.append(c);
}
return sb.toString();
}

04 小结

算法专题目前已连续日更超过六个月,算法题文章224+篇,公众号对话框回复【数据结构与算法】、【算法】、【数据结构】中的任一关键词,获取系列文章合集。

以上就是全部内容,如果大家有什么好的解法思路、建议或者其他问题,可以下方留言交流,点赞、留言、转发就是对我最大的回报和支持!

LeetCode.927-独特邮箱地址(Unique Email Addresses)的更多相关文章

  1. [Swift]LeetCode929. 独特的电子邮件地址 | Unique Email Addresses

    Every email consists of a local name and a domain name, separated by the @ sign. For example, in ali ...

  2. [leetcode] 929. Unique Email Addresses (easy)

    统计有几种邮箱地址. 邮箱名类型:local@domain 规则:1. local中出现"."的,忽略. a.bc=abc 2. local中出现"+"的,+以 ...

  3. 929. Unique Email Addresses

    929. Unique Email Addresses Easy 22766FavoriteShare Every email consists of a local name and a domai ...

  4. 【Leetcode_easy】929. Unique Email Addresses

    problem 929. Unique Email Addresses solution: class Solution { public: int numUniqueEmails(vector< ...

  5. [LeetCode] 929. Unique Email Addresses 独特的邮件地址

    Every email consists of a local name and a domain name, separated by the @ sign. For example, in ali ...

  6. [LeetCode] 929. Unique Email Addresses 唯一的电邮地址

    Every email consists of a local name and a domain name, separated by the @ sign. For example, in ali ...

  7. 【LeetCode】929. Unique Email Addresses 解题报告(Python)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 set + 字符串操作 参考资料 日期 题目地址:h ...

  8. LeetCode 929 Unique Email Addresses 解题报告

    题目要求 Every email consists of a local name and a domain name, separated by the @ sign. For example, i ...

  9. LeetCode 929.Unique Email Addresses

    Description Every email consists of a local name and a domain name, separated by the @ sign. For exa ...

随机推荐

  1. 关于nmap扫描端口

    nmap查看一个服务器的端口,是通过扫描来实现的.所以在本机执行nmap扫描的端口有可能被防火墙阻止,在外部是访问不了的. 如:开启ORACLE监听后,在本机使用nmap 127.0.0.1是可以扫描 ...

  2. The Preliminary Contest for ICPC Asia Nanchang 2019 E. Magic Master

    题目:https://nanti.jisuanke.com/t/41352 思路:约瑟夫环 由题意得第k张牌即求 k 为 第几个 报数为m+1 的单位 用队列模拟即可 #include<bits ...

  3. 使用Vue自定义组件时,报did you register the component correctly? For recursive components, make sure to provide the "name" option.(未注册组件)的原因之一

    错误信息: [Vue warn]: Unknown custom element: <list> - did you register the component correctly? F ...

  4. 华为集群后killsql命令和查看mr占用的磁盘空间

    (1) linux后台:yarn application -list 找到相应的命令 粘贴job (2)去FI manager 的 yarn上粘贴job 看详细过程 (3)确定后 在linux后台 y ...

  5. dede 调取二级三级菜单栏目

    {dede:channelartlist typeid='} <div class="cate-item"> <div class="cate-item ...

  6. 随机验证码生成和join 字符串

    函数:string.join() Python中有join()和os.path.join()两个函数,具体作用如下: join(): 连接字符串数组.将字符串.元组.列表中的元素以指定的字符(分隔符) ...

  7. c++11:lambda表达式的使用

    lambda表达式的一般形式: [capture list] (parameter list) -> return type{function body}; 其中,capture list (捕 ...

  8. CSS的五种基本选择器

    要使用css对HTML页面中的元素实现一对一,一对多或者多对一的控制,这就需要用到CSS选择器. ㈠什么是选择器? 每一条css样式定义由两部分组成,形式如下: [code] 选择器{样式} [/co ...

  9. Oracle 表锁定

    --锁表查询SQL SELECT object_name, machine, s.sid, s.serial# FROM gv$locked_object l, dba_objects o, gv$s ...

  10. Java多线程和并发(四),线程返回值获取方式和Callable接口

    目录 1.主线程等待法 2.使用Thread类的join()阻塞当前线程,等待子线程执行完毕 3.通过Callable接口实现:通过FutureTask Or线程池获取 四.线程返回值获取方式和Cal ...