Rust LeetCode 练习:929 Unique Email Addresses

LeetCode 929 Unique Email Addresses

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

  • +,忽略其后至@前的所有字符。
  • .,忽略之。
  1. 朴素实现:(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
    }
    复制代码
  2. 优化:利用HashSet去重。 Runtime: 4 ms Memory Usage: 921.6 KB

    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
    }
    复制代码
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Rust 是一种现代的编程语言,特别适合处理内存安全和线程安全的代码。在 LeetCode 中,链表是经常出现的题目练习类型,Rust 语言也是一种非常适合处理链表的语言。接下来,本文将从 Rust 语言的特点、链表的定义和操作,以及 RustLeetCode 中链表题目的练习等几个方面进行介绍和讲解。 Rust 语言的特点: Rust 是一种现代化的高性能、系统级、功能强大的编程语言,旨在提高软件的可靠性和安全性。Rust 语言具有如下几个特点: 1. 内存安全性:Rust 语言支持内存安全性和原语级的并发,可以有效地预防内存泄漏,空悬指针以及数据竞争等问题,保证程序的稳定性和可靠性。 2. 高性能:Rust 语言采用了“零成本抽象化”的设计思想,具有 C/C++ 等传统高性能语言的速度和效率。 3. 静态类型检查:Rust 语言支持静态类型检查,可以在编译时检查类型错误,避免一些运行时错误。 链表的定义和操作: 链表是一种数据结构,由一个个节点组成,每个节点保存着数据,并指向下一个节点。链表的定义和操作如下: 1. 定义:链表是由节点组成的数据结构,每个节点包含一个数据元素和一个指向下一个节点的指针。 2. 操作:链表的常用操作包括插入、删除、查找等,其中,插入操作主要包括在链表首尾插入节点和在指定位置插入节点等,删除操作主要包括删除链表首尾节点和删除指定位置节点等,查找操作主要包括根据数据元素查找节点和根据指针查找节点等。 RustLeetCode 中链表题目的练习: 在 LeetCode 中,链表是常见的题目类型,而 Rust 语言也是一个非常适合练习链表题目的语言。在 Rust 中,我们可以定义结构体表示链表的节点,使用指针表示节点的指向关系,然后实现各种操作函数来处理链表操作。 例如,针对 LeetCode 中的链表题目,我们可以用 Rust 语言来编写解法,例如,反转链表,合并两个有序链表,删除链表中的重复元素等等,这样可以更好地熟悉 Rust 语言的使用和链表的操作,提高算法和编程能力。 总之,在 Rust 中处理链表是非常方便和高效的,而 LeetCode 中的练习也是一个非常好的机会,让我们更好地掌握 Rust 语言和链表数据结构的知识。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值