【问题标题】:Minimum swaps to create an alternating binary string of ones and zeros最小交换以创建由 1 和 0 组成的交替二进制字符串
【发布时间】:2017-08-20 06:08:24
【问题描述】:

给定一个二进制字符串,即它只包含 0 和 1(0 的数量等于 1 的数量)我们需要通过 交换 一些位使这个字符串成为一个交替字符序列,我们的目标是尽量减少交换次数。

例如,对于字符串“00011011”,最小交换次数为 2,一种方法是:

1) 交换位:00011011 --->> 00010111

2) 交换位(第一次交换后):00010111 --->> 01010101

请注意,如果给定字符串“00101011”,我们可以将其转换为以 0 开头的备用字符串(需要 3 次交换),也可以转换为以 1 开头的备用字符串(需要一次交换 - 第一个和最后一个位)。
所以在这种情况下最少是一次交换。

最终目标是返回给定字符串 1 和 0 的最小交换次数。 最有效的解决方法是什么?

【问题讨论】:

  • 您已经尝试过什么解决方法?什么地方出了错?就目前而言,这过于宽泛了。如果您已经有一个可行的解决方案,但效率太低,您应该将其发布在 Code Review 上,以便对您的代码进行审查。
  • 嗨,我想不出一个好的策略来解决它,我应该尝试所有可能的交换并检查它是否会导致解决方案吗?好像不太好……

标签: binary swap


【解决方案1】:

琐碎的事情是微不足道的。

  1. 010101010… 异或你的序列。注意:如果序列已经“正确”,你会得到一个全0 比特流(如果你不在乎是从0 还是1 开始,也可以反过来做)。 XOR 在现代 CPU 上非常有效。我可以512 bits at a time on my Xeon,我认为需要2个周期。
  2. 数一数(#ones)。在现代 x87 和许多其他 ISA 上,有一条 POPCNT 指令可以使其非常高效。在我的 CPU 上一次处理一个 64 位。
  3. 必要的交换是#ones/2(很明显)或#zeros/2,以较小者为准。

注意:Code published on this site is CC-by-SA。这意味着当您在软件、作业、考试或作业中使用此答案时,法律要求您说明此答案的 URL 和我的用户名。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-01-12
    • 1970-01-01
    • 2014-02-20
    • 2017-07-12
    • 1970-01-01
    • 2018-10-05
    • 1970-01-01
    • 2019-11-14
    相关资源
    最近更新 更多