题解 | 字符串排序

字符串排序

https://www.nowcoder.com/practice/5190a1db6f4f4ddb92fd9c365c944584

import sys

for line in sys.stdin:
    a = line.split("\n")
    # print(a)
    origin_str = a[0] # 字符串不可更改,无法交换元素
    str_set_sorted = sorted(set([s.lower() for s in origin_str if s.isalpha()]))
    # print(str_set_sorted) 
    str_list = [(c,i) for i,c in enumerate(origin_str)] # 用元组携带原始位置信息
    
    # print(low_list)
    
    for i in range(len(str_list)):
        low_list = [(c.lower(),j) if c.isalpha() else (c,j) for c,j in str_list ] # 将字母统一化为小写
        # print(low_list)

        if not str_list[i][0].isalpha(): #  如果当前字符不是字母,则终止该次循环,进行下次循环
            continue

        if i == len(str_list)-1: # 如果到最后一个字符则退出循环
            break

        # 在剩余切片中找到最小字母,如果没有字母了就退出循环
        c_part_list = [s for s in low_list[i+1:] if s[0].isalpha()]
        if  not c_part_list:
            break
        else:
            min_c =  min(c_part_list) 

        # print(min_c)
        if str_list[i][0].lower() > min_c[0]: # 如果当前字母大于最小字母
            # 返回剩余切片中 第一个最小字母的位置
            pos = [k for k, item in enumerate(str_list[i+1:]) if item[0].isalpha() and item[0].lower() == min_c[0]][0]
            pos += (i+1) # 在完整列表的位置 
            # 交换位置
            temp = str_list[i]
            str_list[i] = str_list[pos]
            str_list[pos] = temp
   
    # 先筛选,后原地排序
    for c in str_set_sorted:
        idx_list = []
        group_list = []
        for i,item in enumerate(str_list):
            if item[0].lower() == c:
                idx_list.append(i)
                group_list.append(item)
        group_list.sort(key=lambda x:x[1])
        for i,idx in enumerate(idx_list):
            str_list[idx] = group_list[i]
        
    # print(str_list)
    print(''.join([c for c,j in str_list]))
        

全部评论

相关推荐

点赞 评论 收藏
分享
09-13 17:25
亲切的00后在笔试:我也遇到了,所以我早他一步查看图片
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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