Rust LeetCode 练习:929 Unique Email Addresses

LeetCode 929 Unique Email Addresses优化

题目大意:邮箱地址格式为[本地名]@[域名],其中[本地名]存在+.两种特殊状况。如今输入一组邮箱地址,要求进行以下处理,而后输出非重复的地址数量。ui

  • +,忽略其后至@前的全部字符。
  • .,忽略之。
  1. 朴素实现:(1)过滤本地名中+@以前全部字符。(2)过滤本地名中.字符。(3)将处理好的地址列表进行去重操做。(4)返回最终数量。 Runtime: 4 ms Memory Usage: 892.9 KB。spa

    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
    }
    复制代码
  2. 优化:利用HashSet去重。 Runtime: 4 ms Memory Usage: 921.6 KBcode

    pub 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
    }
    复制代码
  3. 代码简化:利用for_each迭代器。使人困惑的是,内存暴涨到2.6 MB。 Runtime: 4 ms Memory Usage: 2.6 MB内存

    pub 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
    }
    复制代码
相关文章
相关标签/搜索