美团2021笔试题(第十场)-正则序列

美团2021笔试题(第十场)-正则序列

题目:我们称一个长度为n的序列为正则序列,当且仅当该序列是一个由1~n组成的排列,即该序列由n个正整数组成,取值在[1,n]范围,且不存在重复的数,同时正则序列不要求排序
有一天小团得到了一个长度为n的任意序列,他需要在有限次操作内,将这个序列变成一个正则序列,每次操作他可以任选序列中的一个数字,并将该数字加一或者减一。
请问他最少用多少次操作可以把这个序列变成正则序列?

输入描述:
输入第一行仅包含一个正整数n,表示任意序列的长度。(1<=n<=20000)
输入第二行包含n个整数,表示给出的序列,每个数的绝对值都小于10000。

输出描述:
输出仅包含一个整数,表示最少的操作数量。

示例

输入
5
-1 2 3 10 100
输出
103

解题:

let n = readline();
let list = readline().split(' ').sort((a, b) => {
    return a - b;
  });
let result = 0;
for (let i = 0; i < list.length; i++) {
  if (list[i] <= 0) {
    result = result + Math.abs(i - list[i] + 1);
  } else if (list[i] > 0) {
    result = result + Math.abs(list[i] - i - 1);
  }
}
console.log(result);

解析:
在计算前,我们需要将list数组中的值进行排序,以得到最小的变化操作和,注意这里的sort((a, b) => { return a - b; });中的回调是不可少的,因为没有它的话数组排序中的负数会排序出错

例如
[-1,-3,-8,3,0].sort()
输出:[-1, -3, -8, 0, 3]
[-1,-3,-8,3,0].sort((a,b) => { return a-b})
输出:[-8, -3, -1, 0, 3]

后面的逻辑就容易了,自行理解把。

已标记关键词 清除标记
相关推荐
©️2020 CSDN 皮肤主题: 游动-白 设计师:白松林 返回首页