LeetCode.927-獨特郵箱地址(Unique Email Addresses)

這是悅樂書的第356次更新,第383篇原創

java

01看題和準備

今天介紹的是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]都包含一個'@'字符。

  • 全部本地名稱和域名都是非空的。

  • 本地名稱不以「+」字符開頭。

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+篇,公衆號對話框回覆【數據結構與算法】、【算法】、【數據結構】中的任一關鍵詞,獲取系列文章合集。

以上就是所有內容,若是你們有什麼好的解法思路、建議或者其餘問題,能夠下方留言交流,點贊、留言、轉發就是對我最大的回報和支持!

相關文章
相關標籤/搜索