题解 | #字符串排序#

字符串排序

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))

全部评论

相关推荐

喜欢走神的孤勇者练习时长两年半:爱华,信华,等华,黑华
点赞 评论 收藏
分享
11-06 10:58
已编辑
门头沟学院 嵌入式工程师
双非25想找富婆不想打工:哦,这该死的伦敦腔,我敢打赌,你简直是个天才,如果我有offer的话,我一定用offer狠狠的打在你的脸上
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务