String 输出此字符串序列的第n遍

String 输出此字符串序列的第n遍,string,algorithm,bit-manipulation,c++14,String,Algorithm,Bit Manipulation,C++14,您有一个由字符“0”和“1”组成的字符串。考虑序列为“01011010”。如果0后跟1,则交换0和1的位置。输出序列的第n遍 通过1:'10101100' 通行证2:'11010100' 通过3:'11101000' 第四关:“11110000” 这似乎是修改过的冒泡排序,我们需要输出第n个过程。 我的算法: while(通过!=0) 开始 boolx=假; int prev=∞; for(int i=0;i

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

  • 通过1:'10101100'
  • 通行证2:'11010100'
  • 通过3:'11101000'
  • 第四关:“11110000”
这似乎是修改过的冒泡排序,我们需要输出第n个过程。 我的算法:

while(通过!=0)
开始
boolx=假;
int prev=∞;
for(int i=0;i
输出是正确的,但算法没有那么有效。最坏的情况仍然是O(n^2)。有人能帮我降低时间复杂度吗


谢谢

这里有一个可能的前进方向。我知道这是一个持续的过程

考虑每个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可能结束时,

是唯一允许的操作切换两个相邻的元素?否则,您可以只扫描数字并计数0和1,然后根据O(n)No中的计数输出1,然后输出0,但您需要输出第n遍。如果字符串为“10”,则不能交换,但如果字符串为“01”,则可以交换。是的,这就是我建议的算法()所做的。排序将直接将排序后的字符串输出为11110000 in O(n)。如果我想要第三张通行证,即11101000怎么办?n在第n次传递中输入。这是从5月13日结束的活动竞赛中输入的:是否可以知道传递的有效次数,如字符串为';0100011110' 我们只需要7次通过,而不是10-1=9。在这种情况下,如果所需的通行证超过一半,我会从后面穿过。你能详细说明一下吗?谢谢你的帮助。@user9469335因为这是一个正在进行的比赛,我不想详细说明,但事实是我还没有考虑过这是否能带来一个可行的解决方案。这只是一个探索的可能方式的想法。