【问题标题】:Output nth pass for this string sequence输出此字符串序列的第 n 遍
【发布时间】:2019-09-24 03:45:52
【问题描述】:

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

  • 通过 1:'10101100'
  • 通过 2:'11010100'
  • 通过 3:'11101000'
  • 通过 4:'11110000'

这似乎是修改后的冒泡排序,我们需要输出第 n 遍。 我的算法:

while (pass != 0)
    begin
        bool x = false;
        int prev = ∞;
        for (int i = 0; i < string_length; i++)
        begin
            if (prev == 0) then
                switch (string[i])
                    case 0:
                        break;
                    case 1:
                        string[i] = 0;
                        string[i-1] = 1;
                        prev = ∞;
                        x = true;
                        break;
            else
                prev = string[i];
            end if
        end
        if (!x) 
            break;
        pass = pass - 1;

    end

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

谢谢!

【问题讨论】:

  • 唯一允许的操作是切换两个相邻的元素吗?否则,您可以只扫描数字并计算 0 和 1,然后根据 O(n) 中的计数输出 1,然后输出 0
  • 否,但您需要输出第 n 遍。如果字符串为 '10',则不能交换,但如果字符串为 '01',则可以交换
  • 是的,我建议的算法 (CountingSort) 就是这样做的
  • 计数排序会在O(n)中直接输出排序后的字符串为11110000。如果我想要第三遍 11101000 怎么办? n 在第 n 遍中输入。
  • 这来自于 5 月 13 日结束的活跃竞赛:problem

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


【解决方案1】:

这是一种可能的前进方式。我知道这是一个持续的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 可能结束的一个中断时。

【讨论】:

  • 如果字符串是 '0100011110' 是否可以知道有效的通过次数?我们只需要 7 次通过,而不是 10-1=9。在这种情况下,如果要求的通过超过一半,我会从后面遍历。
  • 您能详细说明一下吗?感谢您的帮助。
  • @user9469335 因为这是一场持续的比赛,我不想详细说明,但事实是我还没有仔细考虑这是否会导致可行的解决方案。这只是一种可能的探索方式的想法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-18
  • 2010-12-25
  • 2016-05-07
  • 2011-02-04
  • 2016-08-28
相关资源
最近更新 更多