题目描述:

给你两个数组,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)

 

SRE实战 互联网时代守护先锋,助力企业售后服务体系运筹帷幄!一键直达领取阿里云限量特价优惠。

输出如下:

=========测试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中重复元素。

扫码关注我们
微信号:SRE实战
拒绝背锅 运筹帷幄