Rust 更新向量值

Rust updating vector values

我只想找到一个 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
            }
        }
    }
}

这是我想出的一个小解决方案 :) 希望对您有所帮助! (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,这正是 rust 所抱怨的。

要解决这个问题,您必须传递可用于更新 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])
    );
}

Playground

注意:我想提出一项改进,因为您正在传递可变引用,所以您不需要从 update_array 方法重新分配给 max_arr 或 return。