这是悦乐书的第356次更新,第383篇原创
java
今天介绍的是LeetCode
算法题中Easy
级别的第218
题(顺位题号是927
)。每封电子邮件都包含本地名称和域名,以@
符号分隔。算法
例如,在alice@leetcode.com
中,alice
是本地名称,leetcode.com
是域名。数据结构
除了小写字母,这些电子邮件可能包含'.'
或'+'
。app
若是在电子邮件地址的本地名称部分中的某些字符之间添加句点('.'
),则在那里发送的邮件将转发到本地名称中没有点的同一地址。例如,“alice.z@leetcode.com”
和“alicez@leetcode.com”
转发到同一个电子邮件地址。(请注意,此规则不适用于域名。)ui
若是在本地名称中添加加号('+'
),则会忽略第一个加号后面的全部内容。这容许过滤某些电子邮件,例如m.y+name@email.com
将转发到my@email.com
。(一样,此规则不适用于域名。)code
能够同时使用这两个规则。leetcode
给定电子邮件列表,咱们会向列表中的每一个地址发送一封电子邮件。有多少不一样的地址实际接收邮件?例如:字符串
输入:[“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”实际收到邮件
注意:string
1 <= emails[i].length <= 100域名
1 <= emails.length <= 100
每封emails[i]
都包含一个'@'
字符。
全部本地名称和域名都是非空的。
本地名称不以“+”
字符开头。
根据题目给的规则,对字符串分两段处理,在本地名称中,若是存在+
号,就截取+
号前的字符串,变成新的本地名称,若是遇到点号,就将点号所有替换,获得新的本地名称,再和域名部分拼接在一块儿,存入HashSet
中,返回HashSet
的size
便可。
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(); }
咱们也能够不使用字符串截取、替换等方法,直接对字符进行判断,而后拼接成新的email
地址,最后存入HashSet
中,返回HashSet
的size
便可。
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(); }
算法专题目前已连续日更超过六个月,算法题文章224+篇,公众号对话框回复【数据结构与算法】、【算法】、【数据结构】中的任一关键词,获取系列文章合集。
以上就是所有内容,若是你们有什么好的解法思路、建议或者其余问题,能够下方留言交流,点赞、留言、转发就是对我最大的回报和支持!