Rust обновляет векторные значения

Я просто хочу найти три самых больших числа Vec<i32>, отсортированных по возрастанию, но у меня проблема с последней функцией. Я не знаю, как мне правильно это сделать.

pub struct Solution;

impl Solution {
    pub fn find_three_largest_numbers(array: Vec<i32>) -> Vec<i32> {
        let mut max_arr = vec![i32::MIN, i32::MIN, i32::MIN];

        for number in array {
            max_arr = Solution::update_array(max_arr, number);
        }

        max_arr
    }

    fn update_array(array: Vec<i32>, number: i32) -> Vec<i32> {
        if array[2] < number {
            Solution::assign_values(&array, 2, number);
        } else if array[1] < number {
            Solution::assign_values(&array, 1, number);
        } else if array[0] < number {
            Solution::assign_values(&array, 0, number);
        }

        array
    }

    fn assign_values(array: &Vec<i32>, index: i32, number: i32) {
         for i in 0..index+1  {
            if i == index {
                array[i as usize] = number; // ERROR: `array` is a `&` reference, so the data it refers to cannot be borrowed as mutable
            } else {
                array[i as usize] = array[(i + 1) as usize]; // ERROR: `array` is a `&` reference, so the data it refers to cannot be borrowed as mutable
            }
        }
    }
}

Это описано в документы ржавчины

Mgetz 17.03.2022 17:33

@NeNe, пожалуйста, проголосуйте и за ответ, спасибо. :)

Chandan 29.03.2022 14:02
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
2
72
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Вот небольшое решение, которое я придумал :) Надеюсь, оно поможет! (P.S. Я старался не использовать причудливые итераторы, на случай, если вы новичок в Rust :))

pub struct Solution;

impl Solution {
    pub fn find_three_largest_numbers(array: Vec<i32>) -> Vec<i32> {
        let mut largest = vec![];

        for a in array.iter() {
            if largest.len() < 3 {
                largest.push(*a);
            } else {
                for i in 0..largest.len() {
                    if a > &largest[i]
                    && !largest.contains(a) {
                        largest[i] = *a;
                    }
                }
            }
        }

        largest
    }
}

fn main() {
    println!("{:?}", Solution::find_three_largest_numbers(vec![-1, 3, 15, 6, -40]));
}
Ответ принят как подходящий

ссылка по умолчанию неизменна, и поскольку вы передаете неизменную ссылку на vec, которую можно использовать для обновления vec, на что жалуется ржавчина.

Чтобы решить эту проблему, вам нужно передать изменяемую ссылку, которую можно использовать для обновления vec.

pub struct Solution;

impl Solution {
    pub fn find_three_largest_numbers(array: Vec<i32>) -> Vec<i32> {
        let mut max_arr = vec![i32::MIN, i32::MIN, i32::MIN];

        for number in array {
            max_arr = Solution::update_array(&mut max_arr, number);
        }

        max_arr
    }

    fn update_array(array: &mut Vec<i32>, number: i32) -> Vec<i32> {
        if array[2] < number {
            Solution::assign_values(array, 2, number);
        } else if array[1] < number {
            Solution::assign_values(array, 1, number);
        } else if array[0] < number {
            Solution::assign_values(array, 0, number);
        }

        array.to_vec()
    }

    fn assign_values(array: &mut Vec<i32>, index: i32, number: i32) {
        for i in 0..index + 1 {
            if i == index {
                array[i as usize] = number;
            } else {
                array[i as usize] = array[(i + 1) as usize];
            }
        }
    }
}

fn main() {
    println!(
        "{:?}",
        Solution::find_three_largest_numbers(vec![-1, 3, 15, 6, -40])
    );
}

Детская площадка

Примечание. Одно улучшение, которое я хотел бы предложить, поскольку вы передаете изменяемую ссылку, вам не нужно переназначать max_arr или возвращаться из update_array метода.

Другие вопросы по теме