如何按模式对向量的元素进行分组?
How to group elements of a vector by a pattern?
如何打断向量,例如 [9,7,6,3,4,0,1,7,3,9]
-> [[9,7,6,3],[4,1],[7,3],[9]]
-> [25,5,10,9]
?
其背后的逻辑是一个向量被分解成子向量,其中每个后续元素都小于前一个元素(0'z被忽略),一个降序。当子向量形成时,每个子向量都被替换为它所有元素的总和。
[https://www.codewars.com/kata/5f8fb3c06c8f520032c1e091][1]
遍历 nums
的元素以构建拆分。对于每个数字,将其与最后一个数字进行比较,以决定是创建一个子列表,还是附加到现有的:
let nums = vec![9,7,6,3,4,0,1,7,3,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();
可能可以使用 Iterator::partition_in_place
做出更优雅的解决方案,但遗憾的是 fn
目前还不稳定。
如何打断向量,例如 [9,7,6,3,4,0,1,7,3,9]
-> [[9,7,6,3],[4,1],[7,3],[9]]
-> [25,5,10,9]
?
其背后的逻辑是一个向量被分解成子向量,其中每个后续元素都小于前一个元素(0'z被忽略),一个降序。当子向量形成时,每个子向量都被替换为它所有元素的总和。
[https://www.codewars.com/kata/5f8fb3c06c8f520032c1e091][1]
遍历 nums
的元素以构建拆分。对于每个数字,将其与最后一个数字进行比较,以决定是创建一个子列表,还是附加到现有的:
let nums = vec![9,7,6,3,4,0,1,7,3,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();
可能可以使用 Iterator::partition_in_place
做出更优雅的解决方案,但遗憾的是 fn
目前还不稳定。