字典序最小的01字符串| 豆包MarsCode AI 刷题

112 阅读4分钟

问题描述

小U拥有一个由0和1组成的字符串,她可以进行最多k次操作,每次操作可以交换相邻的两个字符。目标是通过这些操作,使得最终得到的字符串字典序最小。

例如,小U当前有一个字符串 01010,她最多可以进行 2 次相邻字符交换操作。通过这些操作,她可以将字符串调整为 00101,这是可以通过不超过2次操作得到的字典序最小的字符串。

现在,小U想知道,经过最多k次操作后,能够得到的字典序最小的字符串是什么。


测试样例

样例1:

输入:n = 5, k = 2, s = "01010"
输出:'00101'

样例2:

输入:n = 7, k = 3, s = "1101001"
输出:'0110101'

样例3:

输入:n = 4, k = 1, s = "1001"
输出:'0101'

问题理解

你需要通过最多 k 次相邻字符交换操作,使得给定的由 0 和 1 组成的字符串的字典序最小。字典序最小意味着字符串中的 0 应该尽可能地靠前。

数据结构选择

由于字符串是不可变的,我们可以将其转换为列表,以便进行交换操作。

算法步骤

  1. 转换字符串为列表:将字符串转换为列表,以便进行交换操作。
  2. 遍历字符串:从左到右遍历字符串。
  3. 交换操作:对于每个字符,如果它是 0,尝试将其尽可能地向前移动,直到达到 k 次操作的限制。
  4. 返回结果:将列表转换回字符串并返回。

关键点

  • 优先移动 0:在遍历过程中,优先考虑将 0 向前移动。
  • 操作次数限制:每次交换操作都会减少 k 的值,确保不超过 k 次操作。

代码实现

    def solution(n, k, s):
    # 将字符串转为列表以方便交换
    s = list(s)
    
    # 当前可用的操作次数
    for i in range(n):
        if k <= 0:
            break
        # 如果当前字符是 '0'
        if s[i] == '0':
            # 尝试将 '0' 向前移动
            for j in range(i, 0, -1):
                if s[j - 1] == '1' and k > 0:
                    # 交换 '0' 和 '1'
                    s[j], s[j - 1] = s[j - 1], s[j]
                    k -= 1
                else:
                    break
    
    return ''.join(s)

    if __name__ == '__main__':
    print(solution(5, 2, "01010") == '00101')
    print(solution(7, 3, "1101001") == '0110101')
    print(solution(4, 1, "1001") == '0101')

我们就成功通过了本题🤩

本次我们通过《字典序最小的01字符串》这道题目的解决过程展示了豆包MarsCode AI刷题平台的几个显著亮点:

  1. 算法推荐与指导:当用户在解决问题时遇到瓶颈,例如不知道如何有效统计特定范围内的二进制数中1的个数之和时,AI能够提供具体的算法建议,并给出详细的算法流程、伪代码及实现代码,极大地降低了学习和解决问题的门槛。
  2. 多语言支持与代码转换:虽然豆包MarsCode AI刷题平台可能最初只提供了某些编程语言的支持,但它具备强大的跨语言代码转换功能,可以将用户的C++代码转换成Java或Python等其他语言的等效代码。这一特性对于那些需要在不同语言环境间切换的开发者来说非常有用,确保了用户能够在任何平台上顺利提交解决方案。
  3. 实践性与即时反馈:通过实际编写代码并测试示例输入输出,用户可以在提交之前验证自己的解答是否正确。这种即时的反馈机制有助于加深理解,及时调整错误,提高学习效率。

综上所述,豆包MarsCode AI刷题平台具有精准的算法指导、灵活的多语言支持以及即时的实践反馈,为用户提供了一个高效、便捷且富有成效的学习环境。

好了,那么我们这一次的解析就到这里,后面会给大家展示豆包MarsCode AI刷题的更多功能