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
    }
}

运行结果如下:

在这里插入图片描述


左神java代码