题目:
给你两个数组,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 栏目 欢迎关注留言