這是悅樂書的第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+篇,公衆號對話框回覆【數據結構與算法】、【算法】、【數據結構】中的任一關鍵詞,獲取系列文章合集。
以上就是所有內容,若是你們有什麼好的解法思路、建議或者其餘問題,能夠下方留言交流,點贊、留言、轉發就是對我最大的回報和支持!