面试题答案
一键面试设计思路
- 所有权处理:
- 由于输入的
Vec<T>
和Vec<U>
在合并后不需要保留原始集合,所以可以直接将它们的所有权转移到新的处理逻辑中。这样可以避免不必要的克隆操作,提高效率。
- 由于输入的
- 生命周期处理:
- 这里不需要显式处理生命周期,因为新生成的
Vec<(T, U)>
中的元素是新创建的元组,它们的生命周期从创建开始,到Vec
被销毁结束,不存在悬空引用的问题。
- 这里不需要显式处理生命周期,因为新生成的
- 泛型约束:
- 函数接收的两个集合元素类型
T
和U
都需要实现Clone
trait,这是因为在创建元组时需要克隆元素。如果不克隆,原始集合的所有权被转移后,新的元组会引用已释放的内存,导致悬空引用。
- 函数接收的两个集合元素类型
代码实现
fn merge_sets<T, U>(vec1: Vec<T>, vec2: Vec<U>) -> Vec<(T, U)>
where
T: Clone,
U: Clone,
{
let mut result = Vec::new();
let min_len = std::cmp::min(vec1.len(), vec2.len());
for i in 0..min_len {
result.push((vec1[i].clone(), vec2[i].clone()));
}
result
}
在上述代码中:
- 定义了一个泛型函数
merge_sets
,接收两个不同类型的Vec
,即vec1
和vec2
。 - 通过
where
子句约束T
和U
都要实现Clone
trait。 - 计算两个集合长度的最小值,以避免越界访问。
- 使用
for
循环遍历较短的集合长度,将vec1
和vec2
对应位置的元素克隆后组成元组,添加到结果Vec
中。 - 最后返回合并后的
Vec<(T, U)>
。