LeetCode 929 Unique Email Addresses
题目大意:邮箱地址格式为[本地名]@[域名]
,其中[本地名]
存在+
和.
两种特殊情况。现在输入一组邮箱地址,要求进行如下处理,然后输出非重复的地址数量。
- 对
+
,忽略其后至@
前的所有字符。 - 对
.
,忽略之。
-
朴素实现:(1)过滤本地名中
+
至@
之前所有字符。(2)过滤本地名中.
字符。(3)将处理好的地址列表进行去重操作。(4)返回最终数量。 Runtime: 4 ms Memory Usage: 892.9 KB。pub fn num_unique_emails(emails: Vec<String>) -> i32 { let mut num = 0; let mut process_emails = vec![]; process_emails.clone_from(&emails); let mut process_emails = process_emails .iter_mut() .map(|s| { if let Some(plus) = s.find('+') { if let Some(at) = s.find('@') { if at > plus { s.replace_range(plus..at, ""); } } } s }) .map(|s| { while let Some(dot) = s.find('.') { if let Some(at) = s.find('@') { if dot < at { s.replace_range(dot..(dot + 1), ""); } else { break; } } } s }) .collect::<Vec<_>>(); process_emails.sort(); process_emails.dedup_by(|a, b| a.eq(&b)); process_emails.len() as i32 } 复制代码
-
优化:利用
HashSet
去重。 Runtime: 4 ms Memory Usage: 921.6 KBpub fn num_unique_emails(emails: Vec<String>) -> i32 { use std::collections::HashSet; let mut unique_emails = HashSet::<String>::new(); for email in &emails { let email: Vec<&str> = email.split('@').collect::<Vec<_>>(); let mut local_name = email[0].to_owned(); if let Some(plus) = local_name.find('+') { local_name.replace_range(plus..local_name.len(), ""); }; local_name = local_name.replace('.', ""); unique_emails.insert(local_name + email[1]); } unique_emails.len() as i32 } 复制代码
-
代码简化:利用
for_each
迭代器。令人困惑的是,内存暴涨到2.6 MB。 Runtime: 4 ms Memory Usage: 2.6 MBpub fn num_unique_emails(emails: Vec<String>) -> i32 { use std::collections::HashSet; let mut unique_emails = HashSet::<String>::new(); emails.into_iter().for_each(|s| { let email = s.split("@").collect::<Vec<&str>>(); let mut local_name = email[0].to_owned(); if let Some(plus) = local_name.find('+') { local_name.replace_range(plus.., ""); } local_name = local_name.replace('.', ""); unique_emails.insert(local_name + email[1]); }); unique_emails.len() as i32 } 复制代码