Lintcode算法练习:846.多关键字排序

846.多关键字排序

题目

描述
给定n个同学的学号(从1到n编号)和他们的考试成绩,表示为(学号,考试成绩。
请将这些学生按考试成绩降序排序,若考试成绩相同,则按学号升序排序。

样例
example 1:
input: array = [[2,50],[1,50],[3,100]]
output: [[3,100],[1,50],[2,50]]
example 2:
input: array = [[2,50],[1,50],[3,50]]
ouutput: [[1,50],[2,50],[3,50]]

题解

思路
1. 先根据每名同学的成绩(忽略学号问题)进行降序排序;
2. 再根据学号对成绩重复的同学进行排序;
步骤

  • 利用list.sort()对成绩进行降序排序;
  • 排序后的名单中,成绩重复者相连,遍历整个成绩单;
    • 遇到成绩相同者,开始内层遍历,直至成绩不同;
      • 对重复成绩段,利用sorted()进行排序;
        注意:对部分列表排序利用sorted()先排序再返回原列表
    • 成绩不重复,则更新前者成绩指针;
  • 返回排序后列表;

程序

 def multiSort(array:list):
    #现将学生按成绩降序排列
    array.sort(key = lambda x:x[1],reverse = True)
    #再遍历名单,将重复成绩按学号升序排列
    i,lens = 1,len(array)
    grade_before = array[0][1]
    while i < lens:
        if array[i][1] == grade_before:
            #针对重复成绩,先找到重复次数
            j = i #保护i,(i-1)为重复起点
            while j < lens and array[j][1] == grade_before:
                j = j + 1
            #对重复部分,按学号升序排列
            re_grade = sorted(array[i-1:j],reverse = False) # j指向重复成绩的下一个
            array[i-1:j] = re_grade
            i = j
        else:
            # 更新前者成绩
            grade_before = array[i][1]
            i = i + 1
    return array
发布了4 篇原创文章 · 获赞 0 · 访问量 9

猜你喜欢

转载自blog.csdn.net/hersheya/article/details/105435837