「这是我参与11月更文挑战的第 28 天,活动详情查看:2021最后一次更文挑战」
原题链接
1122. 数组的相对排序 - 力扣(LeetCode) (leetcode-cn.com)
题目描述
给你两个数组,arr1 和 arr2,
- arr2 中的元素各不相同
- arr2 中的每个元素都出现在 arr1 中
对 arr1 中的元素进行排序,使 arr1 中项的相对顺序和 arr2 中的相对顺序相同。未在 arr2 中出现过的元素需要按照升序放在 arr1 的末尾。
测试用例
示例:
输入:arr1 = [2,3,1,3,2,4,6,7,9,2,19], arr2 = [2,1,4,3,9,6]
输出:[2,2,2,1,4,3,3,9,6,7,19]
参数限制
- 1 <= arr1.length, arr2.length <= 1000
- 0 <= arr1[i], arr2[i] <= 1000
- arr2 中的元素 arr2[i] 各不相同
- arr2 中的每个元素 arr2[i] 都出现在 arr1 中
分析
题目已明确告知,arr2 是不重复的,并且都会在 arr1 中出现,根据测试用例的表现,arr1 中会有重复元素的情况, 现在需要我们对 arr1 中的元素进行排序,根据 arr2 中的排列顺序进行整理,未出现在 arr2 的元素则在最后升序排列
我们第一步先获取到在 arr1 但不存在 arr2 的元素,标记为 arr3,需要按升序排列
第二步需要统计同时出现在 arr1 和 arr2 的元素的出现次数,使用一个 Object 来存储出现的次数数据,但需要小改为,元素出现一次,则在对于的 key 上,以数组的方式直接存入一份值
第三步则根据 arr2 中的元素顺序遍历,转化为上一步中的 Object 中的 value 数据,需要用到数组的结构再合并为1个数组
最后把第一步获取到的 arr3 解构追加到结果集中
代码
var relativeSortArray = function(arr1, arr2) {
let set = new Set(arr2);
let arr3 = arr1.filter(n => !set.has(n)).sort((a, b) => a - b);
let obj = {};
arr1.forEach(n => {
if (set.has(n)) {
let ar = obj[n] || [];
ar.push(n)
obj[n] = ar;
}
})
let rt = [];
arr2.forEach(k => rt.push(...obj[k]))
rt.push(...arr3);
return rt;
};
如上的解法,用到了 obj 去记录数字的出现状况,随着数据量的增量,内存消耗也会增多,并且,随着 key 的增多,数组的解构操作也会变多影响到运行的效率,只能说,这种方案在数据量较小的情况下表现良好
今天的力扣刷题就分享到这里,感谢大家的阅读~