给你两个数组,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 中
思路:
刚开始时觉得就是只要把在arr2没出现的元素找出来,然后排序,添加到arr2这个切片后面就可以直接返回。然后报错了,发现arr1是会出现重复的元素,而这些元素是arr2的。然后得到提示是arr2[i]的每个元素都会是在arr1中,那么我就把arr1中的是arr2中的元素以一个map的方式全部计数存储。然后遍历arr2把arr1出现的多个相同元素的时候多append几次,就可以解决我的第一次尝试失败的问题了
解题:
import (
"sort"
)
func relativeSortArray(arr1 []int, arr2 []int) []int {
newArr1 := []int{}
newMap := map[int]int{}
for _, i := range arr1{
flag := false
for _,j := range arr2{
if i == j{
newMap[i] ++
flag = true
break
}
}
if !flag{
newArr1 = append(newArr1,i)
}
}
newArr2 := []int{}
for _,i := range arr2{
for j:= 0;j < newMap[i];j++{
newArr2 = append(newArr2,i)
}
}
sort.Ints(newArr1)
return append(newArr2, newArr1...)
}