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,否则返回falsefor 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中,存在就是交集,存放到resultSetif 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,后面再学其他的,集合很重要,需要重点掌握