当前位置: 首页 > news >正文

rust学习笔记11-集合349. 两个数组的交集

rust除了结构体,还有集合类型,同样也很重要,常见的有数组(Array)、向量(Vector)、哈希表(HashMap) 和 集合(HashSet)字符串等,好意外呀,go没有HashMap、HashSet

数组(Array)、向量(Vector)之前已经接触过了,Array是固定的,数据存放在栈上,Vector是动态数组,数据存放在堆上。通过一个题再复习一下

242. 有效的字母异位词

给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的 字母异位词。

示例 1:

输入: s = "anagram", t = "nagaram"
输出: true

示例 2:

输入: s = "rat", t = "car"
输出: false

提示:

  • 1 <= s.length, t.length <= 5 * 104
  • s 和 t 仅包含小写字母

进阶: 如果输入字符串包含 unicode 字符怎么办?你能否调整你的解法来应对这种情况?

use std::string;
pub fn is_anagram(s: String, t: String) -> bool {
    // 定义一个长度26的数组,因为字母有26个
    let mut nums = vec![0;26];
    // 因为每个字母ASCII都一样,先统计s放入数组,然后再统计t取出
    for c in s.bytes() {
        nums[c as usize - 'a' as usize] += 1;
    }

    for c2 in t.bytes() {
        nums[c2 as usize - 'a' as usize] -= 1;
    }
    //一入一出,再看数组如果数组值都是0说明有效的字母异位词返回ture,否则返回false
    for i in nums {
        if i != 0 {
            return false;
        }
    }

    return  true;
        
}

fn main() {
    let s = String::from("anagram");
    let t = String::from("nagaram");
    let res = is_anagram(s, t);
    println!("{}", res);
    println!("{}", is_anagram(String::from("rat"),String::from("car")));

}

HashSet 学过java的同学很熟悉,它一种不可重复切无序的集合,和HashMap相似 HashMap下一篇再讲, 本次我们用它来解决 两个数组的交集

基本用法

use std::collections::HashSet;

let mut set: HashSet<i32> = HashSet::new();

// 插入元素
set.insert(1);
set.insert(2);
set.insert(3);

// 检查是否包含某个值
if set.contains(&2) {
    println!("集合包含 2");
}

// 删除元素
set.remove(&2);

// 遍历集合
for num in &set {
    println!("{}", num);
}

349. 两个数组的交集

给定两个数组 nums1 和 nums2 ,返回 它们的 交集 。输出结果中的每个元素一定是 唯一 的。我们可以 不考虑输出结果的顺序 。

示例 1:

输入:nums1 = [1,2,2,1], nums2 = [2,2]
输出:[2]

示例 2:

输入:nums1 = [4,9,5], nums2 = [9,4,9,8,4]
输出:[9,4]
解释:[4,9] 也是可通过的

提示:

  • 1 <= nums1.length, nums2.length <= 1000
  • 0 <= nums1[i], nums2[i] <= 1000

解答

use std::collections::HashSet;

pub fn intersection(nums1: Vec<i32>, nums2: Vec<i32>) -> Vec<i32> {
    // 有一个数组为空直接返回空
    if nums1.len() == 0 || nums2.len() == 0 {
        let vector: Vec<i32> = Vec::new();
        return  vector;
    }

    let mut set: HashSet<i32> = HashSet::new();
    let mut resultSet : HashSet<i32> = HashSet::new();
    //先去第一个数组的重复项
    for i in nums1 {
        set.insert(i);
    }

    for j in nums2 {
        // 判断nums2的元素在不在set中,存在就是交集,存放到resultSet
        if set.contains(&j) {
            resultSet.insert(j);
        }
    }

    return  resultSet.into_iter().collect();
        
}

fn main() {
    let  nums1 = vec![1,2,2,1];
    let  nums2 = vec![2,2];
    let res = intersection(nums1, nums2);
    println!("{:?}", res);
    
}

总结,rust也有丰富的集合类型,本次只学习Vector和HashSet,后面再学其他的,集合很重要,需要重点掌握

相关文章:

  • FreeRTOS系列---程序正常,但任务无法创建
  • Qt之QGraphicsView图像操作
  • C语言--快速排序和归并排序
  • 【回溯】216. 组合总和 III
  • 大模型Agent:人工智能的崭新形态与未来愿景
  • DICOM服务中的C-STORE、 C-FIND、C-MOVE、C-GET、Worklist
  • 一文讲清楚自我学习和深度学习
  • 通过微步API接口对单个IP进行查询
  • postman请求后端接受List集合对象
  • IDEA中Git版本回退终极指南:Reset与Revert双方案详解
  • GIt分支合并
  • PHP 包含(Include)机制详解
  • 向量数据库Chroma的介绍
  • MySQL-高级查询
  • 36-Openwrt wifi命令工具iwconfig、iwinfo、iwpriv、iwlist
  • LeetCode hot 100—环形链表 II
  • Qt中txt文件输出为PDF格式
  • 嵌入式学习-EXTI外部中断
  • Java UDP 通信:实现简单的 Echo 服务器与客户端
  • R JSON 文件
  • 网站制作成品免费/青岛百度快速排名优化
  • 客户网站建设问题/国内快速建站
  • 武汉模板建站定制网站/大数据培训包就业靠谱吗
  • 婚纱网站设计/游戏推广公司怎么接游戏的
  • 电子商务网站建设的主页/网络推广的具体方式
  • 易语言做购物网站/站长友情链接