leetcode'овские задачки
Sep. 28th, 2021 12:10 amДан список емейлов, в котором у пользователей могут быть точки в любом месте имени, плюс хвостик +что-то, но только в части до домена @. Гарантируется, что левая-правая часть существует, и есть точно один '@'. Задача - посчитать уникальные email'ы.
Это прямо референсная задача для "пощупать match".
Я всё ещё слегка неловко ощущаю в районе map/reduce растового исполнения, хотя он тут просится.
use std::collections::{HashSet};
#[derive(Clone,Copy)]
enum Part{
Local,
Tail,
Domain
}
fn normalize(email: &String) -> String{
let mut part = Part::Local;
let mut output = String::with_capacity(email.len());
for s in email.chars(){
output.push(
match (part, s) {
(Part::Domain, _) => s,
(_, '@') => {
part = Part::Domain;
s
},
(Part::Tail, _) => {continue},
(Part::Local, '.') => {continue},
(Part::Local, '+') => {
part = Part::Tail;
continue
},
(Part::Local, _) => s
}
)
}
output
}
impl Solution {
pub fn num_unique_emails(emails: Vec<String>) -> i32 {
let mut uAddr: HashSet<String> = HashSet::with_capacity(emails.len());
for email in emails.iter(){
uAddr.insert(normalize(email));
}
uAddr.len() as i32
}
}
Особенно офигенно тут использование continue в середине выражения match. Оно строго правильное по типу и говорит, что результат выражения - bottom type (unreachable code), так что в push в этом случае управление не попадает.