2022-04-15:给定一个非负数组arr,学生依次坐在0~N-1位置,每个值表示学生的安静值, 如果在i位置安置插班生,那么i位置的安静值变成0,同时任何同学都会被影响到而减少安静值, 同学安静值减少的量: N - 这个同学到插班生的距离, 但是减到0以下的话,当做0处理。 返回一个和arr等长的ans数组,ans[i]表示如果把插班生安排在i位置,所有学生的安静值的和。 比如 : arr = {3,4,2,1,5},应该返回{4,3,2,3,4}。 比如 : arr = {10,1,10,10,10},应该返回{24,27,20,20,22}。 arr长度 <= 10^5。 arr中值 <= 2 * 10^5。
答案2022-04-15:
具体见代码。
代码用rust编写。代码如下:
fn main() {
let arr: Vec<isize> = vec![3, 4, 2, 1, 5];
let ret: Vec<isize> = quiet1(arr);
println!("{:?}", ret);
}
fn quiet1(arr: Vec<isize>) -> Vec<isize> {
if arr.len() == 0 {
let right: Vec<isize> = Vec::new();
return right;
}
let n = arr.len() as isize;
let mut ans: Vec<isize> = Vec::new();
for i in 0..n {
ans.push(0);
}
for i in 0..n {
let mut sum: isize = 0;
for j in 0..i {
sum += get_max(0, arr[j as usize] - (n - abs(i - j)));
}
for j in i + 1..n {
sum += get_max(0, arr[j as usize] - (n - abs(i - j)));
}
ans[i as usize] = sum;
}
return ans;
}
fn get_max(a: isize, b: isize) -> isize {
if a > b {
a
} else {
b
}
}
fn abs(a: isize) -> isize {
if a < 0 {
-a
} else {
a
}
}
运行结果如下: