作为一名Rust新手,我正在解决Project Euler问题,以帮助我熟悉这种语言。第4个问题涉及回文,我找到了两种创建回文向量的方法,但我不确定它们中的任何一种是如何工作的。
我正在使用一个字符串向量
对于筛选回文产品,我有以下两个解决方案: 解决方案1:
他们都得出了正确的结果,但我不知道为什么!
在解决方案1中,我们比较了一个字符串的引用和一个我们刚刚创建的字符串的引用?
在解决方案2中,我们取消引用了一个字符串的引用,并将其与取消引用的新字符串进行比较?
我希望能够做到的是:
我正在使用一个字符串向量
products
,计算方法如下:let mut products = Vec::new();
for i in 100..500 {
for j in 500..1000 {
products.push((i * j).to_string());
}
}
对于筛选回文产品,我有以下两个解决方案: 解决方案1:
let palindromes: Vec<_> = products
.iter()
.filter(|&x| x == &x.chars().rev().collect::<String>())
.collect();
解决方案2:
let palindromes: Vec<_> = products
.iter()
.filter(|&x| *x == *x.chars().rev().collect::<String>())
.collect();
他们都得出了正确的结果,但我不知道为什么!
在解决方案1中,我们比较了一个字符串的引用和一个我们刚刚创建的字符串的引用?
在解决方案2中,我们取消引用了一个字符串的引用,并将其与取消引用的新字符串进行比较?
我希望能够做到的是:
let palindromes: Vec<_> = products
.iter()
.filter(|x| x == x.chars().rev().collect::<String>())
.collect();
我希望有人能够解释:
- 我的两个解决方案有什么不同,为什么它们都有效?
- 为什么在过滤函数中不能只使用
x
而不引用或取消引用它?
谢谢!
String
,您可以比较迭代器:.filter(|x| x.chars().eq(x.chars().rev()))
。 (提示:这是一段代码,建议在翻译时尽可能保留原有的代码格式和结构) - Boiethioscollect
会在堆上创建一个新的String
)的回文检查方法? :) - MB-F.eq
,这超级好!谢谢!然而采用暴力方法会遇到很多问题;感谢@kazemakase给我们的教训 :) - piercebot