@radionnazmiev
Self-taught alien

Как разбить вектор на подвектора разной длинны?

Допустим имеется вектор [9,7,6,3,4,0,1,7,3,9] который я хочу превратить в [[9,7,6,3],[4,1],[7,3],[9]] потом суммировать все элементы подвекторов и получить [25,5,10,9] где нули опускаются. Элементы группируются по принципу 9>7>6>3.. 3 не больше 4, поэтому 3 будет последним элементом данного подвектора.

Источник: задание с codewars - Blobservation 2: Merge Inert Blobs
  • Вопрос задан
  • 84 просмотра
Решения вопроса 1
@vabka
Токсичный
Если вы не собираетесь менять данные - можно создать новый вектор из readonly-срезов
Отдельная задача - нахождение индексов, где ломается сортированность (не помню, как это называется, но у этого есть термин)
Точки эти можно найти простым циклом, в пределах которого как раз можно создавать срезы и пушить в новый вектор.
Потом по этому вектору со срезами делаешь map и sum
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
hrls
@hrls
fn main() {
    let values: Vec<u64> = vec![9, 7, 6, 3, 4, 0, 1, 7, 3, 9];

    let (_, groups): (Option<u64>, Vec<Vec<u64>>) = values
        .into_iter()
        .filter(|value| *value > 0)
        .fold((None, vec![]), |(previous, mut groups), current| {
            match previous {
                Some(previous) if previous >= current => {
                    if let Some(last_group) = groups.last_mut() {
                        last_group.push(current);
                    } else {
                        groups.push(vec![current]);
                    }
                }
                _ => groups.push(vec![current]),
            };
            (Some(current), groups)
        });

    dbg!(&groups);

    let sums: Vec<u64> = groups
        .into_iter()
        .map(|group| group.into_iter().sum())
        .collect();

    dbg!(&sums);
}


https://play.rust-lang.org/?version=stable&mode=de...
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы