微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何按模式对向量的元素进行分组?

如何解决如何按模式对向量的元素进行分组?

如何打断像 [9,7,6,3,4,1,9] -> [[9,3],[4,1],[7,[9]] -> [25,5,10,9] 这样的向量?

其背后的逻辑是将向量分解为子向量,其中每个后续元素都小于前一个元素(0'z 被忽略),一个降序序列。当子向量形成时,每个子向量都被替换为其所有元素的总和。

[https://www.codewars.com/kata/5f8fb3c06c8f520032c1e091][1]

解决方法

迭代 nums 的元素以构建拆分。对于每个数字,将其与最后一个数字进行比较,以决定是创建子列表还是附加到现有的列表中:

let nums = vec![9,7,6,3,4,1,9];
let mut split: Vec<Vec<i32>> = vec![vec![]];
for num in nums.iter().filter(|n| **n != 0) {
    let sublist = split.last_mut().unwrap();
    match sublist.last_mut() {
        Some(x) if num > x => {
            split.push(vec![*num]);
        }
        _ => sublist.push(*num),}
}
let split = split; // make split immmutable
let summed: Vec<i32> = split.iter().map(|v| v.iter().sum()).collect();

(try in playground)

可能可以使用 Iterator::partition_in_place 制定更优雅的解决方案,但遗憾的是,fn 目前还不稳定。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。