929. 獨特的電子郵件地址
每封電子郵件都由一個本地名稱和一個域名組成,以 @ 符號分隔。
例如,在 [email protected]
中, alice
是本地名稱,而 leetcode.com
是域名。
除了小寫字母,這些電子郵件還可能包含 ','
或 '+'
。
如果在電子郵件地址的本地名稱部分中的某些字元之間新增句點('.'
),則發往那裡的郵件將會轉發到本地名稱中沒有點的同一地址。例如,"[email protected]”
和 “[email protected]”
會轉發到同一電子郵件地址。 (請注意,此規則不適用於域名。)
如果在本地名稱中新增加號('+'
),則會忽略第一個加號後面的所有內容。這允許過濾某些電子郵件,例如 [email protected]
將轉發到 [email protected]
。 (同樣,此規則不適用於域名。)
可以同時使用這兩個規則。
給定電子郵件列表 emails
,我們會向列表中的每個地址傳送一封電子郵件。實際收到郵件的不同地址有多少?
示例:
輸入:["[email protected]","[email protected]","[email protected]"] 輸出:2 解釋:實際收到郵件的是 "[email protected]" 和 "[email protected]"。
提示:
1 <= emails[i].length <= 100
1 <= emails.length <= 100
- 每封
emails[i]
都包含有且僅有一個'@'
字元。
思路:這是一道簡單難度的題目,題目描述比較直觀,
在讀到‘@’ 和 ‘+’, 只要字元不等於‘ . ’ ,將讀到的字元就都放到新的字串裡面
在讀到‘@’之前 ,如果讀到了‘+’,那麼‘+’和到‘@’之間的字元都不放入新的字串中
最後如果‘@’已經讀到了,則‘@’和其後的字元都放入新的字串中
為了節省空間,新的子串直接覆蓋emails[i]處的字串
之後還要判斷新的字串與前面的字串是否重複,如果存在重複的則cnt--(cnt最開始等於emails中的個數),並且break出迴圈
程式碼中 hasread表示是否讀到了‘@’字元,hasread1表示是否讀到了‘+’字元 。 目前beat 99%
class Solution { public int numUniqueEmails(String[] emails) { int hasread=0; //是否到了@符號,@後面的不用管 int hasread1=0; int size=0; char[] ch; int index=0; int cnt = emails.length; for(int i=0;i<emails.length;++i){ hasread=0; hasread1=0; index=0; size = emails[i].length(); ch = new char[size]; for(int j=0;j<size;++j){ if(emails[i].charAt(j)=='@') hasread=1; if(emails[i].charAt(j)=='+') hasread1=1; if(hasread==0){ if(hasread1==0 && emails[i].charAt(j)!='.') ch[index++]=emails[i].charAt(j); } else ch[index++]=emails[i].charAt(j); } emails[i] = new String(ch,0,index); //對比前面是否有相同 for(int k=i-1;k>=0;--k){ if(emails[k].equals(emails[i])) {cnt--;break;} } } return cnt; } }
%