【一天一大 lee】数组的相对排序 (难度:简单) - Day20201114

86 阅读2分钟

题目:

给你两个数组,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]

提示:

  • arr1.length, arr2.length <= 1000
  • 0 <= arr1[i], arr2[i] <= 1000
  • arr2 中的元素 arr2[i] 各不相同
  • arr2 中的每个元素 arr2[i] 都出现在 arr1 中

抛砖引玉

  • 先遍历arr1通过哈希记录arr2元素及元素个数
  • 声明两个新数组:
    • 一个新数组存放arr1中不存在arr的元素:arr;
    • 另外一个用于返回结果:_result;
  • 遍历arr2,每个元素位置用map中存放的集合代替存到结果数组中,并且清除已经处理的哈希
  • 对map中未处理的集合(这部分就是arr1独有的元素),存放到arr中,并且对arr排序
  • 合并arr和_result
抛砖引玉
抛砖引玉
/**
 * @param {number[]} arr1
 * @param {number[]} arr2
 * @return {number[]}
 */
var relativeSortArray = function(arr1, arr2) {
  let map = new Map(),
    _result = [],
    arr = [];
// 使用哈希记录arr1中每个元素的集合
  for (let i = 0; i < arr1.length; i++) {
    if (map.has(arr1[i])) {
      map.get(arr1[i]).push(arr1[i])
    } else {
      map.set(arr1[i][arr1[i]])
    }
  }
  // 按照arr2元素顺序存放哈希arr对应的集合
  for (let i = 0; i < arr2.length; i++) {
    if (map.has(arr2[i])) {
      _result = _result.concat(map.get(arr2[i]))
      map.delete(arr2[i])
    }
  }
  // 存放arr1中独有的元素
  for (let [key, value] of map.entries()) {
    arr = arr.concat(value)
  }

  arr.sort((a, b) => a - b)
  return _result.concat(arr)
};

博客: 前端小书童

公众号:前端小书童

每天的每日一题,写的题解会同步更新到公众号一天一大 lee 栏目 欢迎关注留言