「这是我参与2022首次更文挑战的第12天,活动详情查看:2022首次更文挑战」
1122. 数组的相对排序
给你两个数组,arr1 和 arr2,arr2 中的元素各不相同,arr2 中的每个元素都出现在 arr1 中。
对 arr1 中的元素进行排序,使 arr1 中项的相对顺序和 arr2 中的相对顺序相同。未在 arr2 中出现过的元素需要按照升序放在 arr1 的末尾。
示例1:
输入: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]
示例2:
输入: arr1 = [28,6,22,8,44,17], arr2 = [22,28,8,6]
输出: [22,28,8,6,17,44]
提示:
- 1 <= arr1.length, arr2.length <= 1000
- 0 <= arr1[i], arr2[i] <= 1000
- arr2 中的元素 arr2[i] 各不相同
- arr2 中的每个元素 arr2[i] 都出现在 arr1 中
暴力+map
思路 由题可得,我们需要对arr1进行排序,但是存在于arr2中的元素需要按照arr2中元素出现的顺序进行排序,最后arr1剩余的不在arr2中的元素排在arr1的末尾,按照升序排序
所以我们首先需要知道arr1哪些元素存在于arr2中
这里我们用一个map对象来记录arr2中的元素map[arr2[i]] = 0
接下来统计arr1中存在于arr2中的元素的数量。 遍历arr1
- 将map[item]不等于undefined的元素(这就是存在于arr2中的元素)的值+1,
- 将map[item]等于undefined的元素(这是不存在arr2中的元素)暂存与temp数组中
接下来需要先对arr1中的存在于arr2中的所有元素进行排序,顺序按照arr2中的出现顺序
所以我们只需要对arr2进行遍历
- 并且从map中得到该值的数量,放入arr1中的对应位置,所以这里需要一个index从0开始,每次index++
- 当arr2遍历完毕,处理剩余的temp中的元素
- 声明last和t,last代表arr1中末尾部分未排序的元素的首位,t代表temp中当前需要放入arr1中的元素下标
- 遍历temp将temp[t]放入arr1[last],然后last和t都加一
最后返回arr1即可
var relativeSortArray = function (arr1, arr2) {
var temp = [];
var map = {}
// 保存arr2中存在的元素
for (var i = 0; i < arr2.length; i++) {
var item = arr2[i]
map[item] = 0
}
// 比那里arr1统计2中拥有的元素的数量
for (var i = 0; i < arr1.length; i++) {
var item = arr1[i]
if (map[item] !== undefined) {
map[item]++
} else {
temp.push(item)
}
}
var index = 0
// 从新放入新数组
for (var i = 0; i < arr2.length; i++) {
var item = arr2[i]
while (map[item] > 0) {
arr1[index] = item
index++
map[item]--
}
}
temp.sort((a, b) => a - b)
var last = arr1.length - temp.length
var t = 0
while(last<arr1.length){
arr1[last] = temp[t]
last++
t++
}
return arr1
};