leetcode1122之数组的相对排序

题目描述:

给你两个数组,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 中
来源:力扣(LeetCode)
链接: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中重复元素。

原文地址:https://www.cnblogs.com/rounie/p/13040341.html