原文github地址
给你两个数组,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]
leet code地址原题
解法1
- 首先区分两个数组中不同的元素,把不同的元素放入一个新的数组进行排序
- 以arr2为原型对比arr1中相同的元素,如果相同则推入一个数组
- 两个新的数组进行合并
- 时间复杂度为 O(n^2)
var relativeSortArray = function(arr1, arr2) {
let arr3=[]
for(var i=0;i<arr1.length;i++){
if(arr2.indexOf(arr1[i])<0){
arr3.push(arr1[i])
}
}
let arr = []
for(var i=0;i<arr2.length;i++){
for(var j=0;j<arr1.length;j++){
if(arr2[i]===arr1[j]){
arr.push(arr1[j])
}
}
}
return arr.concat(arr3.sort((a,b)=>a-b))
};
解法2
- 以arr2为原型,循环他的长度,然后每次都会弹出尾部一个元素,
- 弹出的元素与arr1从后往前进行比较
- 相等则推入一个新的数组,同时arr1删除掉相同的元素
- 最后arr1只会剩下与arr2不同的元素了
- 两个新的数组进行合并
var relativeSortArray = function(arr1, arr2) {
let result = []
while (arr2.length) {
let i = arr1.length
let target = arr2.pop()
while (i--) {
if (arr1[i] === target) {
result.unshift(target)
arr1.splice(i, 1)
}
}
}
return result.concat(arr1.sort((a, b) => a - b))
};
这只是其中一个思路,期待更好的解法