如何在不移动 Rust 的情况下反转列表

问题描述 投票:0回答:1

我正在尝试编写一个简单的函数来检测回文。我找不到一种方法来避免在反转时移动 nums,所以我最终得到了以下结果:

fn is_palindrome(num: String) -> bool {
    let nums: Vec<char> = num.chars().collect();  
    let reversed: Vec<char> = nums.clone().into_iter().rev().collect();  
    nums == reversed         
}

有没有一种方法可以在不使用 .clone() 的情况下做到这一点?谢谢。

rust reverse borrow-checker
1个回答
0
投票

正如评论中提到的,您不需要将前向或反向迭代收集到 vec 中。事实上,您甚至不需要使用输入字符串。

相反,您可以创建一个正向迭代器和一个反向迭代器,并一次比较一个字符:

fn is_palindrome(num: &str) -> bool {
    num.chars()
        .zip(num.chars().rev())
        .all(|(l,r)| l==r)
}

即使这样也太过分了,因为你实际上只需要比较角色的前半部分和后半部分:

fn is_palindrome(num: &str) -> bool {
    num.chars().take(num.len()/2)
        .zip(num.chars().rev().take(num.len()/2))
        .all(|(l,r)| l==r)
}
© www.soinside.com 2019 - 2024. All rights reserved.