< 返回版块

坚果修补匠 发表于 2021-01-14 14:47

今天做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/

评论区

写评论
Neutron3529 2021-01-15 12:54

是的,多谢:)

--
👇
坚果修补匠: Rust 4ms 2.3MB 一行这个题解是你的嘛?我帮你顶一下。

--
👇
Neutron3529: 哭唧唧

我写完scan的题解之后……果然大家都不带看的吗?

作者 坚果修补匠 2021-01-14 23:08

Rust 4ms 2.3MB 一行这个题解是你的嘛?我帮你顶一下。

--
👇
Neutron3529: 哭唧唧

我写完scan的题解之后……果然大家都不带看的吗?

Neutron3529 2021-01-14 18:35

哭唧唧

我写完scan的题解之后……果然大家都不带看的吗?

作者 坚果修补匠 2021-01-14 16:31

感谢

--
👇
Aya0wind: 巧了,今天早上我刚做了这题。 scan接受F闭包的第一个参数是一个&mut,你要直接在闭包里修改它才有迭代的效果,而fold每次运算的结果都是根据F的返回值来的,这两个当然不一样,用scan的话要这样写。

impl Solution {
    pub fn prefixes_div_by5(a: Vec<i32>) -> Vec<bool> {
        a.iter().scan(0, |sum, &x| {
            *sum = (*sum * 2 + x) % 5;
            Some(*sum == 0)
        }).collect()
    }
}
作者 坚果修补匠 2021-01-14 16:27

了解了。我之前以为scan是类似python的accumulate那种。就是accumulate(1,[1,2,3])-> 2,4,7。文档还是没细看

--
👇
Aya0wind: 巧了,今天早上我刚做了这题。 scan接受F闭包的第一个参数是一个&mut,你要直接在闭包里修改它才有迭代的效果,而fold每次运算的结果都是根据F的返回值来的,这两个当然不一样,用scan的话要这样写。

impl Solution {
    pub fn prefixes_div_by5(a: Vec<i32>) -> Vec<bool> {
        a.iter().scan(0, |sum, &x| {
            *sum = (*sum * 2 + x) % 5;
            Some(*sum == 0)
        }).collect()
    }
}
Aya0wind 2021-01-14 15:11

巧了,今天早上我刚做了这题。 scan接受F闭包的第一个参数是一个&mut,你要直接在闭包里修改它才有迭代的效果,而fold每次运算的结果都是根据F的返回值来的,这两个当然不一样,用scan的话要这样写。

impl Solution {
    pub fn prefixes_div_by5(a: Vec<i32>) -> Vec<bool> {
        a.iter().scan(0, |sum, &x| {
            *sum = (*sum * 2 + x) % 5;
            Some(*sum == 0)
        }).collect()
    }
}
1 共 6 条评论, 1 页