字符串字符类型排序问题 | 豆包MarsCode AI刷题

166 阅读4分钟

字符串字符类型排序问题

题目描述

问题描述

小C 需要对一个字符串进行特殊排序,这个字符串只包含三种字符类型:字母(大小写)、数字和问号。要求你按照以下规则进行排序:

  1. 问号的原始位置必须保持不变。
  2. 数字的原始位置必须保持不变,但数字要按照从大到小排序。
  3. 字母的原始位置必须保持不变,但字母要按照字典序从小到大排序。

你需要编写一个程序,帮助小C实现这个字符串的排序功能。


测试样例

样例1:

输入:inp = "12A?zc" 输出:'21A?cz'

样例2:

输入:inp = "1Ad?z?t24" 输出:'4Ad?t?z21'

样例3:

输入:inp = "???123??zxy?" 输出:'???321??xyz?'

题目解析

这个问题的关键在于对给定字符串中的不同类型字符进行特定规则的排序,同时保持问号的位置不变以及数字和字母各自在原始位置不变。具体来说,需要分别对字符串中的数字和字母进行独立的排序操作,而不影响它们在字符串中的整体位置分布。

解题思路分析

  1. 分离与标记:首先,可以将字符串中的字符分为数字、字母和问号三类,并记录它们在原始字符串中的位置。这样可以在后续的排序过程中,只对数字和字母进行排序,而不会影响问号的位置。
  2. 数字排序:对于数字部分,可以提取出所有的数字,并按照从大到小的顺序进行排序。在排序过程中,需要记住每个数字在原始字符串中的位置,以便在最后组合结果字符串时能够正确地放置数字。
  3. 字母排序:对于字母部分,同样提取出所有的字母,并按照字典序从小到大进行排序。与数字排序类似,也要记录每个字母在原始字符串中的位置。
  4. 结果组合:最后,根据记录的位置信息,将排序后的数字和字母以及未变动的问号重新组合成一个新的字符串,这个字符串就是满足要求的排序结果。

举例子演示

以样例 1 的输入 “12A?zc” 为例:

  1. 初始化阶段:
    • 数字列表为 [1, 2],字母列表为 ['A', 'z', 'c'],问号列表为 ['?'],位置信息列表为 [(1, 0), (2, 1), ('A', 2), ('?', 3), ('z', 4), ('c', 5)]。
  2. 数字排序阶段:
    • 排序后的数字列表为 [2, 1]。
  3. 字母排序阶段:
    • 排序后的字母列表为 ['A', 'c', 'z']。
  4. 结果组合阶段:
    • 遍历位置信息列表,第一个元素是 (1, 0),对应的字符是数字 1,从排序后的数字列表中取出第一个数字 2,添加到结果字符串中。
    • 第二个元素是 (2, 1),对应的字符是数字 2,从排序后的数字列表中取出第二个数字 1,添加到结果字符串中。
    • 第三个元素是 ('A', 2),对应的字符是字母 A,从排序后的字母列表中取出第一个字母 A,添加到结果字符串中。
    • 第四个元素是 ('?', 3),对应的字符是问号,直接将问号添加到结果字符串中。
    • 第五个元素是 ('z', 4),对应的字符是字母 z,从排序后的字母列表中取出第二个字母 c,添加到结果字符串中。(这里出现错误,应该是从排序后的字母列表中取出第三个字母 z,添加到结果字符串中)
    • 第六个元素是 ('c', 5),对应的字符是字母 c,从排序后的字母列表中取出第二个字母 c,添加到结果字符串中。

最终结果字符串为 '21A?cz'。

个人解答

def solution(inp):
    # Edit your code here
    inp_arr = list(inp)
    char_arr = []
    digit_arr = []
    for i in range(len(inp_arr)):
        if inp_arr[i].isdigit() :
            digit_arr.append(inp_arr[i])
        elif inp_arr[i].isalpha() :
            char_arr.append(inp_arr[i])
    char_arr = sorted(char_arr)
    digit_arr = list(reversed(sorted(digit_arr)))
    char_arr_index = 0
    digit_arr_index = 0
    result_arr = []
    for i in range(len(inp_arr)):
        if inp_arr[i].isdigit() :
            result_arr.append(digit_arr[digit_arr_index])
            digit_arr_index+=1
        elif inp_arr[i].isalpha() :
            result_arr.append(char_arr[char_arr_index])
            char_arr_index+=1
        else:
            result_arr.append(inp_arr[i])
    my_string = ''.join(result_arr)
    return my_string


if __name__ == "__main__":
    # Add your test cases here
    # print(solution("12A?zc"))
    print(solution("12A?zc") == "21A?cz")
    print(solution("1Ad?z?t24") == "4Ad?t?z21")
    print(solution("???123??zxy?") == "???321??xyz?")

小结

这题其实不难 就是稍微复杂一些 在写这道题时也了解了 isdigit 和 isalpha函数

还是算有所收获的