青训营X豆包MarsCode 技术训练营第一课

21 阅读3分钟

问题理解 我们需要通过最多k次相邻字符交换操作,使得给定的由'0'和'1'组成的字符串的字典序最小。字典序最小意味着尽可能多的'0'在前面,'1'在后面。 解题思路 遍历字符串:从左到右遍历字符串,找到第一个'1'。 交换操作:尝试将这个'1'与前面的'0'交换,直到达到操作次数限制k。 更新字符串:在每次交换后,更新字符串并减少可用的操作次数k。 具体步骤 初始化: 将字符串转换为列表以便进行交换操作。 初始化一个变量k来记录剩余的交换次数。 遍历字符串: 从左到右遍历字符串,找到第一个'1'。 对于每个'1',尝试将其与前面的'0'交换。 交换操作: 从当前位置向前遍历,尝试将'1'与前面的'0'交换。 每次交换后,减少可用的交换次数k。 返回结果: 将列表转换回字符串并返回。 伪代码 plaintext function solution(n, k, s):    # 将字符串转换为列表以便进行    交换操作    s_list = list(s)        # 遍历字符串    for i from 0 to n-1:        # 如果当前字符是'1',尝        试将其移到前面        if s_list[i] == '1':            # 从当前位置向前遍            历,尝试将'1'与前            面的'0'交换            for j from i to             0:                # 如果前面的字                符是'0'且还有                剩余的交换次数                if s_list                [j] == '0'                 and k > 0:                    # 交换字                    符                    swap                    (s_list                    [i],                     s_list                    [j])                    # 减少可                    用的交换                    次数                    k -= 1                else:                    break        # 将列表转换回字符串并返回    return ''.join(s_list)

关键点 遍历字符串:从左到右遍历字符串,找到第一个'1'。 交换操作:从当前位置向前遍历,尝试将'1'与前面的'0'交换,直到达到操作次数限制k。 更新字符串:每次交换后,更新字符串并减少可用的操作次数k 优化思路 记录最优交换位置: 在遍历字符串时,记录当前'1'可以交换到的最前面的'0'的位置。 这样可以避免不必要的交换操作。 优先交换最前面的'1': 在遍历字符串时,找到第一个'1',然后尝试将其与最前面的'0'进行交换。 优化后的代码 python def solution(n: int, k: int, s: str) -> str:    # 将字符串转换为列表以便进行    交换操作    s_list = list(s)        # 遍历字符串    for i in range(n):        # 如果当前字符是'1',尝        试将其移到前面        if s_list[i] == '1':            # 记录最优交换位置            best_swap_index             = -1            # 从当前位置向前遍            历,找到最前面的            '0'            for j in range            (i, -1, -1):                if s_list                [j] == '0':                    best_swa                    p_index                     = j                    break                        # 如果找到了最前面            的'0'且还有剩余的            交换次数            if             best_swap_index             != -1 and k > 0:                # 交换字符                s_list[i],                 s_list                [best_swap_i                ndex] =                 s_list                [best_swap_i                ndex],                 s_list[i]                # 减少可用的交                换次数                k -= 1        # 将列表转换回字符串并返回    return ''.join(s_list)if name == 'main':    print(solution(5, 2,     "01010") == '00101')    print(solution(7, 3,     "1101001") == '0110101')    print(solution(4, 1,     "1001") == '0101')

关键点解释 记录最优交换位置: 在遍历字符串时,记录当前'1'可以交换到的最前面的'0'的位置。 这样可以避免不必要的交换操作。 优先交换最前面的'1': 在遍历字符串时,找到第一个'1',然后尝试将其与最前面的'0'进行交换。 通过这种方式,我们可以确保每次交换操作都能最大程度地减小字符串的字典序,从而减少交换操作的次数