我正在尝试编写一个简单的函数来检测回文。我找不到一种方法来避免在反转时移动 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() 的情况下做到这一点?谢谢。
正如评论中提到的,您不需要将前向或反向迭代收集到 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)
}