站队顺序输出
描述
有一群人站队,每人通过一对整数(h, k)来描述,其中h表示人的高度,k表示在此人前面队列中身高不小于此人的总人数。
实现一个算法输出这个队列的正确顺序。
输入:
[[7,0], [4,4], [7,1], [5,0], [6,1], [5,2]]
输出:
[[5,0], [7,0], [5,2], [6,1], [4,4], [7,1]]
思路:先用第二项升序排列再用第一项降序排列。可保证对于有相同第二项的元素中第一项小的在后,插入时可在前。同时要保证第一项相同的两个元素中第二个元素小的先插入。
1 def takeFirst(li): 2 return(li[0]) 3 def takeSecond(li): 4 return(li[1]) 5 ls=[[7,0], [4,4], [7,1], [5,0], [6,1], [5,2]] 6 ls.sort(key=takeSecond) 7 ls.sort(key=takeFirst,reverse=True) 8 output=[] 9 for item in ls : 10 output.insert(item[1],item) 11 print(output)
两次排序结果如下
[[7, 0], [5, 0], [7, 1], [6, 1], [5, 2], [4, 4]]
[[7, 0], [7, 1], [6, 1], [5, 0], [5, 2], [4, 4]]
1 # inputls = eval(input()) 2 inputls = [[7, 0], [4, 4], [7, 1], [5, 0], [6, 1], [5, 2]] 3 sortls = sorted(inputls) #将输入列表从小到大排序 4 num = len(sortls) 5 indexls = list(range(num)) #初始化一个列表记录输出列表的索引值 6 output = list(range(num)) #初始化输出列表,设定列表长度 7 pops = [] #存放循环中需要从indexls中删除的索引值 8 for x in range(num): 9 k = sortls[x][1] 10 index = indexls[k] 11 output[index] = sortls[x] 12 if x < num-1 and sortls[x][0] == sortls[x+1][0]: 13 pops.append(k) 14 else: 15 pops.append(k) 16 for p in pops: 17 indexls[p] = 'flag' 18 while 'flag' in indexls: 19 indexls.remove('flag') 20 pops = [] 21 22 print(output)
上面的代码引用自
https://blog.csdn.net/u013378642/article/details/80875793 的博客