【发布时间】: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