Hi,大家好,这里是炼手Rust专栏,我是xiaoK,今天来看一个小问题:去掉连续重复的项。
提问
实现函数一个函数,该函数接受一个序列作为参数,并返回一个列表,其中没有任何彼此相邻的具有相同值的元素,并保留元素的原始顺序。
例:
input:AAAABBBCCDAABBB
output:['A', 'B', 'C', 'D', 'A', 'B']
input:ABBCcAD
output:['A', 'B', 'C', 'c', 'A', 'D']
模板:
fn unique_in_order<T>(sequence: T) -> Vec<T::Item>
where
T: std::iter::IntoIterator,
T::Item: std::cmp::PartialEq + std::fmt::Debug,
{
}
分析
注意给出的例子,该问题中,我们需要的是删除连续重复的项,所以,AABAA的正确输出是ABA,前后的A是不连续的,所有需要保留两个,那么正常情况下,我们需要遍历该序列,然后比对前一个和后一个,如果不相等,继续后移,如果相等,就执行删除操作。操作是比较简单的,如果是链表结构,删除元素是非常简单的,但如果是数组结构,就需要整体向前移动。
在rust中,有个非常简单的方法,我们直接看解决方案。
解决方案
fn unique_in_order<T>(sequence: T) -> Vec<T::Item>
where
T: std::iter::IntoIterator,
T::Item: std::cmp::PartialEq + std::fmt::Debug,
{
let mut vec = Vec::from_iter(sequence);
vec.dedup();
vec
}
Trick
Vec::from_iter可以将迭代器转换成Vec。- 通过
dedup,可以消去连续的重复元素。如果我们要排序之后消去重复元素,可以先sort,然后dedup。