amarao: (Default)
[personal profile] amarao

Дан список емейлов, в котором у пользователей могут быть точки в любом месте имени, плюс хвостик +что-то, но только в части до домена @. Гарантируется, что левая-правая часть существует, и есть точно один '@'. Задача - посчитать уникальные 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 в этом случае управление не попадает.

Date: 2021-09-27 09:44 pm (UTC)
juan_gandhi: (Default)
From: [personal profile] juan_gandhi

Формулировка странная. Игнорировать все, что между плюсом и собакой?

Date: 2021-09-28 12:56 am (UTC)
juan_gandhi: (Default)
From: [personal profile] juan_gandhi

Про точки я не знал. Спасибо.

Date: 2021-09-28 06:13 am (UTC)
yurikhan: (Default)
From: [personal profile] yurikhan

С плюсиком так работают почти вообще все почтовые серверы. Считает точки незначащими — только(?) Gmail.

Profile

amarao: (Default)
amarao

February 2026

S M T W T F S
123456 7
8910111213 14
15161718192021
22232425262728

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Feb. 25th, 2026 01:12 pm
Powered by Dreamwidth Studios