如何将矢量与其自身的反转版本进行比较?

mfi*_*rry 4 equality rust

为什么不编译?

fn isPalindrome<T>(v: Vec<T>) -> bool {
  return v.reverse() == v;
}
Run Code Online (Sandbox Code Playgroud)

我明白了

error[E0308]: mismatched types
 --> src/main.rs:2:25
  |
2 |   return v.reverse() == v;
  |                         ^ expected (), found struct `std::vec::Vec`
  |
  = note: expected type `()`
             found type `std::vec::Vec<T>`
Run Code Online (Sandbox Code Playgroud)

blu*_*uss 15

由于您只需要查看前半部分和后半部分,您可以使用DoubleEndedIterator特征(方法.next().next_back())以这种方式查看前后元素对:

/// Determine if an iterable equals itself reversed
fn is_palindrome<I>(iterable: I) -> bool
where
    I: IntoIterator,
    I::Item: PartialEq,
    I::IntoIter: DoubleEndedIterator,
{
    let mut iter = iterable.into_iter();
    while let (Some(front), Some(back)) = (iter.next(), iter.next_back()) {
        if front != back {
            return false;
        }
    }

    true
}
Run Code Online (Sandbox Code Playgroud)

(在操场上跑)

这个版本更通用,因为它支持任何双端迭代,例如slice和chars迭代器.

它只检查每个元素一次,如果迭代器是奇数长度,它会自动跳过剩余的中间元素.


She*_*ter 13

阅读您正在使用的功能的文档:

在适当的位置反转切片中元素的顺序.

或者检查功能签名:

fn reverse(&mut self)
Run Code Online (Sandbox Code Playgroud)

方法的返回值是单元类型,空元组().你无法将它与矢量进行比较.


在风格上,Rust使用4个空格缩进,snake_case函数和变量的标识符,并在块的末尾有一个隐式返回.您应该使用新语言调整这些约定.

此外,如果您没有向向量添加项目,则应该使用a &[T]而不是aVec<T>.

为了解决您的问题,我们将使用迭代器来比较切片.您可以获得幻灯片的前向和后向迭代器,与反转整个阵列相比,这需要非常小的空间.Iterator::eq允许您简洁地进行比较.

你还需要声明它T与自身相当,这需要EqPartialEq.

fn is_palindrome<T>(v: &[T]) -> bool
where
    T: Eq,
{
    v.iter().eq(v.iter().rev())
}

fn main() {
    println!("{}", is_palindrome(&[1, 2, 3]));
    println!("{}", is_palindrome(&[1, 2, 1]));
}
Run Code Online (Sandbox Code Playgroud)

如果你想做空间效率较低的版本,你必须自己分配一个新的向量:

fn is_palindrome<T>(v: &[T]) -> bool
where
    T: Eq + Clone,
{
    let mut reverse = v.to_vec();
    reverse.reverse();
    reverse == v
}

fn main() {
    println!("{}", is_palindrome(&[1, 2, 3]));
    println!("{}", is_palindrome(&[1, 2, 1]));
}
Run Code Online (Sandbox Code Playgroud)

请注意,我们现在还需要Clone向量中的项,因此我们添加绑定到该方法的特征.

  • 通过两次查看每个元素,你正在做双重工作.我发布了一个替代答案.:) (3认同)