给你两个数组,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 中
哈希表:
首先创建一个映射 indexMap,用于记录 arr2 中每个元素的索引。然后,我们使用自定义排序函数 sort.Slice 对 arr1 进行排序。在排序函数中,我们比较 arr1[i] 和 arr1[j] 在 indexMap 中的索引。
如果两个元素都在 arr2 中出现,我们按照 arr2 中的顺序进行排序。 如果只有 arr1[i] 在 arr2 中出现而 arr1[j] 不在,我们将 arr1[i] 排在 arr1[j] 之前。
如果只有 arr1[j] 在 arr2 中出现而 arr1[i] 不在,我们将 arr1[j] 排在 arr1[i] 之前。
如果两个元素都未在 arr2 中出现,我们按照升序进行排序。
最后,我们返回排序后的 arr1。
func relativeSortArray(arr1 []int, arr2 []int) []int {
// 创建一个映射来记录arr2中每个元素的索引
indexMap := make(map[int]int)
for i, num := range arr2 {
indexMap[num] = i
}
// 自定义排序函数
sort.Slice(arr1, func(i, j int) bool {
index1, found1 := indexMap[arr1[i]]
index2, found2 := indexMap[arr1[j]]
// 如果arr1[i]和arr1[j]都在arr2中出现,则按照arr2中的顺序排序
if found1 && found2 {
return index1 < index2
}
// 如果arr1[i]在arr2中出现而arr1[j]不在,则arr1[i]排在arr1[j]之前
if found1 {
return true
}
// 如果arr1[j]在arr2中出现而arr1[i]不在,则arr1[j]排在arr1[i]之前
if found2 {
return false
}
// 如果arr1[i]和arr1[j]都未在arr2中出现,则按照升序排序
return arr1[i] < arr1[j]
})
return arr1
}
执行结果: 通过 显示详情 查看示例代码 添加备注
执行用时: 4 ms , 在所有 Go 提交中击败了 35.00% 的用户 内存消耗: 2.2 MB , 在所有 Go 提交中击败了 56.67% 的用户 通过测试用例: 17 / 17 炫耀一下:
本文由 mdnice 多平台发布