概述
美团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]
后面的逻辑就容易了,自行理解把。
最后
以上就是可爱黑裤为你收集整理的美团2021笔试题(第十场)-正则序列的全部内容,希望文章能够帮你解决美团2021笔试题(第十场)-正则序列所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复