【力扣刷题】1122. 数组的相对排序

258 阅读1分钟

「这是我参与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;
};

image.png

如上的解法,用到了 obj 去记录数字的出现状况,随着数据量的增量,内存消耗也会增多,并且,随着 key 的增多,数组的解构操作也会变多影响到运行的效率,只能说,这种方案在数据量较小的情况下表现良好


今天的力扣刷题就分享到这里,感谢大家的阅读~