题解 | 字符串排序
字符串排序
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]))
海康威视公司福利 1125人发布