gpt4 book ai didi

rust - 如何检查切片中是否有重复项?

转载 作者:行者123 更新时间:2023-11-29 07:56:07 25 4
gpt4 key购买 nike

有没有一种本地方法可以检查切片是否有重复项?现在,我使用这个:

fn has_dup<T: PartialEq>(slice: &[T]) -> bool {
for i in 1..slice.len() {
if slice[i..].contains(&slice[i - 1]) {
return true;
}
}
false
}

fn main() {
assert_eq!(has_dup(&[1, 2, 3, 2, 5, 6]), true);
assert_eq!(has_dup(&[1, 2, 3, 4, 5, 6]), false);
}

但是对于这种基本的操作,我不喜欢用手写代码。

如果标准库中没有可用的函数来执行此操作,是否可以优化我的代码?我知道索引切片不是最优化的方式(for i in slice {} vs for i in 0..slice.len() { slice[i] }).

最佳答案

就算法的复杂性而言,跟踪索引中的唯一值通常更好。如果您可以使用 HashEq 检查相等性,您可以试试这个实用函数:

fn has_unique_elements<T>(iter: T) -> bool
where
T: IntoIterator,
T::Item: Eq + Hash,
{
let mut uniq = HashSet::new();
iter.into_iter().all(move |x| uniq.insert(x))
}

assert!(!has_unique_elements(vec![10, 20, 30, 10, 50]));
assert!(has_unique_elements(vec![10, 20, 30, 40, 50]));
assert!(has_unique_elements(Vec::<u8>::new()));

Playground

同样,如果您的元素没有实现 Hash 但实现了 Ord , 你可以使用 BTreeSet而是 ( Playground )。

关于rust - 如何检查切片中是否有重复项?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46766560/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com