题解 | #成绩排序#

成绩排序

https://www.nowcoder.com/practice/8e400fd9905747e4acc2aeed7240978b

# 为了满足时间复杂度,选用稳定的归并排序,要返回排序后的原下标
# 其实排序时不需要稳定,只要输出时稳定就行,这有两个30分,你告诉我哪个是谁的,我说是谁的就是谁的!
def MergeSort(lst, mode=1):
    """
    lst: 待排序的列表
    mode: 排序模式, mode=0为降序, mode=1为升序
    """
    def merge(arr, ids, left, mid, right):
        nonlocal mode
        # 待合并的两段的指针
        i = left
        j = mid+1
        tmp = []
        itmp = []
        while i <= mid and j <= right: # 这个while保证先从两个已排好的段中去除小的部分
            if mode == 1:
                if arr[i] <= arr[j]: # 这里的=保证了稳定性
                    tmp.append(arr[i])
                    itmp.append(ids[i])
                    i += 1
                else:
                    tmp.append(arr[j])
                    itmp.append(ids[j])
                    j += 1
            else:
                if arr[i] >= arr[j]: # 这里的=保证了稳定性
                    tmp.append(arr[i])
                    itmp.append(ids[i])
                    i += 1
                else:
                    tmp.append(arr[j])
                    itmp.append(ids[j])
                    j += 1
        while i <= mid: # 以下两个while不用验证mode是因为段内已经排好顺序
            tmp.append(arr[i])
            itmp.append(ids[i])
            i += 1
        while j <= right:
            tmp.append(arr[j])
            itmp.append(ids[j])
            j += 1
        for i in range(left, right+1):
            arr[i] = tmp[i - left]
            ids[i] = itmp[i - left]
        
    def mSort(arr, ids, left, right):
        if left >= right:
            return
        mid = (left+right)// 2
        mSort(arr, ids, left, mid)
        mSort(arr, ids, mid+1, right)
        merge(arr, ids, left, mid, right)
    
    n = len(lst)
    ids = list(range(n)) # 原下标顺序列表
    if n <= 1:
        return lst
    mSort(lst, ids, 0, n-1)
    return lst, ids





while True:
    try:
        num = int(input().strip())
        mode = int(input().strip())
        na_list = list()
        sc_list = list()
        for _ in range(num):
            name, score = input().strip().split(' ')
            score = int(score)
            na_list.append(name)
            sc_list.append(score)
        sc_list, ids = MergeSort(sc_list, mode)
        for i, index in enumerate(ids):
            print(' '.join([na_list[index], str(sc_list[i])]))
    except:
        break

机试可不要这么写,太浪费时间了!!!

最后的空间复杂度没有满足要求,是O(2n)。应该还能优化,不过看了大佬题解我放弃这个思路了。同好们自己有时间去优化吧!

全部评论

相关推荐

点赞 评论 收藏
分享
来个厂收我吧:首先,市场侧求职我不是很懂。 但是,如果hr把这份简历给我,我会觉得求职人不适合做产品经理。 问题点: 1,简历的字体格式不统一,排版不尽如人意 2,重点不突出,建议参考star法则写个人经历 3,印尼官方货币名称为印度尼西亚卢比(IDR),且GMV690000印尼盾换算为305人民币,总成交额不高。 4,右上角的意向职位在发给其他公司时记得删除。 5,你所有的经历都是新媒体运营,但是你要投市场营销岗位,jd和简历不匹配,建议用AI+提示词,参照多个jd改一下经历内容。 修改建议: 1,统一字体(中文:思源黑体或微软雅黑,英文数字:time new romans),在word中通过表格进行排版(b站学) 2,校招个人经历权重:实习经历=创业经历(大创另算)>项目经历>实训经历>校园经历 3,请将项目经历时间顺序改为倒序,最新的放最上方。 4,求职方向不同,简历文字描述侧重点也需要不同。
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务