這是悅樂書的第356次更新,第383篇原創
01看題和準備
今天介紹的是
LeetCode
算法題中
Easy
級别的第
218
題(順位題号是
927
)。每封電子郵件都包含本地名稱和域名,以
@
符号分隔。
例如,在
中,
alice
是本地名稱,
leetcode.com
是域名。
除了小寫字母,這些電子郵件可能包含
'.'
或
'+'
。
如果在電子郵件位址的本地名稱部分中的某些字元之間添加句點(
'.'
),則在那裡發送的郵件将轉發到本地名稱中沒有點的同一位址。例如,
和
轉發到同一個電子郵件位址。(請注意,此規則不适用于域名。)
如果在本地名稱中添加加号(
'+'
),則會忽略第一個加号後面的所有内容。這允許過濾某些電子郵件,例如
将轉發到
。(同樣,此規則不适用于域名。)
可以同時使用這兩個規則。
給定電子郵件清單,我們會向清單中的每個位址發送一封電子郵件。有多少不同的位址實際接收郵件?例如:
輸入:[“[email protected]”,“[email protected]”,
“[email protected]”]
輸出:2
說明:“[email protected]”和“[email protected]”實際收到郵件
注意:
- 1 <= emails[i].length <= 100
- 1 <= emails.length <= 100
- 每封
都包含一個emails[i]
字元。'@'
- 所有本地名稱和域名都是非空的。
- 本地名稱不以
字元開頭。“+”
02 第一種解法
根據題目給的規則,對字元串分兩段處理,在本地名稱中,如果存在
+
号,就截取
+
号前的字元串,變成新的本地名稱,如果遇到點号,就将點号全部替換,得到新的本地名稱,再和域名部分拼接在一起,存入
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();
}
03 第二種解法
我們也可以不使用字元串截取、替換等方法,直接對字元進行判斷,然後拼接成新的
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();
}
04 小結
算法專題目前已連續日更超過六個月,算法題文章224+篇,公衆号對話框回複【資料結構與算法】、【算法】、【資料結構】中的任一關鍵詞,擷取系列文章合集。
以上就是全部内容,如果大家有什麼好的解法思路、建議或者其他問題,可以下方留言交流,點贊、留言、轉發就是對我最大的回報和支援!