题解 | #字符串排序#
字符串排序
https://www.nowcoder.com/practice/5190a1db6f4f4ddb92fd9c365c944584
# 编写一个程序,将输入字符串中的字符按如下规则排序。 # 规则 1 :英文字母从 A 到 Z 排列,不区分大小写。 # 如,输入: Type 输出: epTy # 规则 2 :同一个英文字母的大小写同时存在时,按照输入顺序排列。 # 如,输入: BabA 输出: aABb # 规则 3 :非英文字母的其它字符保持原来的位置。 # 如,输入: By?e 输出: Be?y # 数据范围:输入的字符串长度满足 1 \le n \le 1000 \1≤n≤1000 # 解题思路: # 首先,大写字母的ASCII码是要比小写字母的ASCII码要要的, # 所以我们用大写字母的ASCII码规则排序,就不会产生字母大小写字母相同时,大写字母总在小写字母之前的情况 # 第二,标点符号这些非英文字母的字符,只要知道它在原字符串中的索引,然后按原索引将其值插入到排序之后的列表中 # 最后将列表转为字符串输出即可 str1 = input() s = '' # 存储排序后的子字符串 count = 0 # 计数,控制index方法的起始位置 for item in str1: # 遍历原字符串,判断每个字符是否是字母 if item.isalpha(): s += item lst = sorted(s, key=str.upper) # 排序,按“s字符串中的字母的大写”规则排序,返回一个列表 for item in str1: # 再次遍历原字符串,然后将不是字母的字符做插入处理 if not item.isalpha(): # index返回的是“匹配字符的第一个索引”,所以用count来控制匹配开始的位置,以保证当前字符的索引正确 a = str1.index(item, count) # 这一行也可以不用,写出来更好理解,因为count是从0开始的,这和a的值是一样的 lst.insert(a, item) # 无论匹配结果怎么样,count都要+1,表示下一次的匹配从下一个字符开始 count += 1 print(''.join(lst))