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,后面再学其他的,集合很重要,需要重点掌握