题目描述
给你两个数组,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 中
解题思路
- 计数排序
- 先统计第一个数组里面每个数字出现的次数,按着第二个数组每个数组每个数字出现的先后顺序
- 最后剩余的数组,按照数值的大小关系,排成从小到大,拼接到结果数组的后面
代码
var relativeSortArray = function(arr1, arr2) {
// 开的数组要比1000多几位
let cnt = new Array(1005).fill(0);
let res = [];
// 计数
// 统计第一个数组里面每个数字出现的次数
for(let i = 0; i < arr1.length; i++) {
cnt[arr1[i]] += 1;
}
// 看第二个数组每个数字出现的先后顺序,进行归置arr1
for(let i = 0; i < arr2.length; i++) {
while(cnt[arr2[i]]--) {
res.push(arr2[i]);
}
}
// 最后剩余的数字,按照数值的大小关系,排成从小到大,拼接到结果数组的后面。
for(let i = 0; i < cnt.length; i++) {
if(cnt[i] <= 0) continue;
while(cnt[i]--) {
res.push(i);
}
}
return res;
};