今天做leetcode的每日一题时遇到了一个问题。最开始我写了题解A,发现当运行原题给的测例时不过。后来用fold写了题解B过了。这两者的迭代过程应该是一样的啊。求解答。 原题
给定由若干 0 和 1 组成的数组 A。我们定义 N_i:从 A[0] 到 A[i] 的第 i 个子数组被解释为一个二进制数(从最高有效位到最低有效位)。
返回布尔值列表 answer,只有当 N_i 可以被 5 整除时,答案 answer[i] 为 true,否则为 false。
输入:[0,1,1,1,1,1]
输出:[true,false,false,false,true,false]
题解A
impl Solution {
pub fn prefixes_div_by5(a: Vec<i32>) -> Vec<bool> {
a.iter()
.scan(0, |res, &i| Some((2 * *res + i) % 5))
.map(|x| x == 0)
.collect()
}
}
题解B
impl Solution {
pub fn prefixes_div_by5(a: Vec<i32>) -> Vec<bool> {
let mut result: Vec<bool> = vec![];
a.iter()
.fold(0, |res, i|
{
let res = (2 * res + i) % 5;
result.push(res == 0);
res
});
result
}
}
Ext Link: https://leetcode-cn.com/problems/binary-prefix-divisible-by-5/
1
共 6 条评论, 1 页
评论区
写评论是的,多谢:)
--
👇
坚果修补匠: Rust 4ms 2.3MB 一行这个题解是你的嘛?我帮你顶一下。
--
👇
Neutron3529: 哭唧唧
我写完
scan
的题解之后……果然大家都不带看的吗?Rust 4ms 2.3MB 一行这个题解是你的嘛?我帮你顶一下。
--
👇
Neutron3529: 哭唧唧
我写完
scan
的题解之后……果然大家都不带看的吗?哭唧唧
我写完
scan
的题解之后……果然大家都不带看的吗?感谢
--
👇
Aya0wind: 巧了,今天早上我刚做了这题。 scan接受F闭包的第一个参数是一个&mut,你要直接在闭包里修改它才有迭代的效果,而fold每次运算的结果都是根据F的返回值来的,这两个当然不一样,用scan的话要这样写。
了解了。我之前以为scan是类似python的accumulate那种。就是accumulate(1,[1,2,3])-> 2,4,7。文档还是没细看
--
👇
Aya0wind: 巧了,今天早上我刚做了这题。 scan接受F闭包的第一个参数是一个&mut,你要直接在闭包里修改它才有迭代的效果,而fold每次运算的结果都是根据F的返回值来的,这两个当然不一样,用scan的话要这样写。
巧了,今天早上我刚做了这题。 scan接受F闭包的第一个参数是一个&mut,你要直接在闭包里修改它才有迭代的效果,而fold每次运算的结果都是根据F的返回值来的,这两个当然不一样,用scan的话要这样写。