输出此字符串序列的第n次传递

时间:2019-05-06 13:33:56

标签: string algorithm bit-manipulation c++14

您有一个包含字符“ 0”和“ 1”的字符串。考虑该序列为“ 01011010”。如果0后跟1,则交换0和1的位置。输出序列的第n个遍。

  • 通行证1:“ 10101100”
  • 第二遍:“ 11010100”
  • 第3遍:“ 11101000”
  • 第4遍:“ 11110000”

这似乎是经过修改的冒泡排序,在这里我们需要输出第n次传递。 我的算法:

TextBox TextBox1 = row.FindControl("txt1") as TextBox;

输出正确,但是算法效率不高。最坏的情况仍然是O(n ^ 2)。有人可以帮助我减少时间复杂度吗?

谢谢!

1 个答案:

答案 0 :(得分:0)

这是前进的可能方法。我了解这是一个持续的contest

考虑每个1的“等待”时间。我们关心的是1的左边直接有其他1的位置,为此,他们必须“等待”才能开始移动。以及1的零个数不足以防止它们在到达其他1的组时额外的“等待”。

示例:

        "waiting" periods
        0 1 2 3     0+3-2+1
        ^ ^ ^ ^     ^ 1+3-2+1
        ^ ^ ^ ^     ^ ^
0 0 0 0 1 1 1 1 0 0 1 1
0 0 0 1 0 1 1 1 0 1 0 1
0 0 1 0 1 0 1 1 1 0 1 0
0 1 0 1 0 1 0 1 1 1 0 0
1 0 1 0 1 0 1 0 1 1 0 0
1 1 0 1 0 1 0 1 0 1 0 0
              ^   ^
              ^   5 moves - 3 wait
              ^
              5 moves - 2 wait

使用我们的“等待”时间段,我们可以计算每个1的终止位置,尽管在考虑多个中断以及如何确定任意1可能终止的位置时,还有很多其他方面。