Я просто хочу найти три самых больших числа 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
}
}
}
}
@NeNe, пожалуйста, проголосуйте и за ответ, спасибо. :)
Вот небольшое решение, которое я придумал :) Надеюсь, оно поможет! (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
метода.
Это описано в документы ржавчины