# 题目描述

小红拿到了一个长度为 n 的数组,她定义数组的 ”陡峭值“ 为相邻两数之差的绝对值之和

例如,对于数组 [1, 3, 1, 4, 2] 而言,其陡峭值为 2 + 2 + 3 + 2 = 9

现在小红定义f(i) 为,只修改第 i 个元素的情况下,数组可以达成的最小陡峭值

请你输出每个 f(i) 的值

# 测试用例

  • 输入: 3
  • 输入:1 2 1
  • 输出:1 0 1

说明:

  • 若将第一个元素修改为2,数组变成[2,2,1],陡峭值为1。
  • 若将第二个元素修改为1,数组变成[1,1,1],陡峭值为0。
  • 若将第三个元素修改为2,数组变成[1,2,2],陡峭值为1。
  • 可以证明,以上修改的方案得到的陡峭值是最小的。

# 思路

模拟遍历即可

# 代码实现

var __readline = require("readline-sync");
__readline.setDefaultOptions({ prompt: "" });
var readline = __readline.prompt;

console.log("请输入数组长度n: ");
const n = parseInt(readline());
console.log("请输入数组arr: (空格隔开)");

const arr = readline()
  .split(" ")
  .map((item) => parseInt(item));

function test(arr, n) {
  let cnt = 0;

  // 计算数组总的陡峭值
  for (let i = 1; i < n; i++) {
    cnt += Math.abs(arr[i] - arr[i - 1]);
  }

  let res = [];
  for (let i = 0; i < n; i++) {
    // 数组两端位置特殊考虑

    // 将当前位置与下一个位置的陡峭值减去 比如 1 2, 最小情况是 2 2
    if (i === 0) {
      res[i] = cnt - Math.abs(arr[i] - arr[i + 1]);
    } else if (i === n - 1) {
      res[i] = cnt - Math.abs(arr[i] - arr[i - 1]);
    } else {
      let gap =
        Math.abs(arr[i - 1] - arr[i]) +
        Math.abs(arr[i] - arr[i + 1]) -
        Math.abs(arr[i - 1] - arr[i + 1]);
      res[i] = cnt - gap;
    }
  }

  return res.join(" ");
}

console.log("结果为: ", test(arr, n));

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43