题目描述:
给你两个数组,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]
输出:[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 中
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/relative-sort-array
链接:https://leetcode-cn.com/problems/relative-sort-array
代码实现:
1 def relativeSort(arr1, arr2): 2 ''' 3 4 :param arr1: 5 :param arr2: 6 :return: 7 ''' 8 temp = [[] for i in range(1001)] 9 10 arr3 = [] # 存放不在arr2,但在arr1中的剩余元素 11 for i in arr1: 12 temp[i].append(i) 13 if i not in arr2: 14 arr3.append(i) 15 16 result = [] 17 18 for i in arr2: 19 result.extend(temp[i]) 20 21 result.extend(sorted(arr3)) 22 23 return result 24 25 26 print('=========测试relativasort()=============') 27 arr1 = [2, 3, 1, 3, 2, 4, 6, 7, 9, 2, 19] 28 arr2 = [2, 1, 4, 3, 9, 6] 29 result = relativeSort(arr1, arr2) 30 print("result=", result) 31 32 33 def relativesort1(arr1, arr2): 34 result = [] 35 for num in arr2: 36 while num in arr1: 37 result.append(num) 38 arr1.remove(num) 39 40 # result.extend(sorted(arr1)) 41 result += sorted(arr1) 42 43 return result 44 45 46 print("-------------测试relativesort1()---------") 47 result = relativesort1(arr1, arr2) 48 print("result=", result)
输出如下:
=========测试relativasort()============= result= [2, 2, 2, 1, 4, 3, 3, 9, 6, 7, 19] -------------测试relativesort1()--------- result= [2, 2, 2, 1, 4, 3, 3, 9, 6, 7, 19]
思考:
上述采用两种方法实现了题目要求。方法二相对方法一更简单,代码质量更高!在方法一中,需要做两件事,第一需要将重复元素放在数组的同一位置,并需要找出不存在于arr2中的元素,将其存放到另一个数组;第二即是根据arr2中元素顺序,实现将arr1中元素放入result数组中。第一步中,找不同元素和归纳相同元素均需要通过遍历arr1实现,索性遍历一遍即可。第二步中,由于排序依据是arr2,所以应遍历arr2。
需要加强理解两个函数:extend()和append().
方法二代码简洁,清晰易懂。有个特别称赞的地方,就是使用while循环实现搜索arr1中重复元素。