如何在某些指定位置将数组子集移到左侧?

时间:2017-11-10 22:47:13

标签: algorithm

我有一个这样的数组:A = [X, 0, X, Y, Y, 0, 0, Y, Z, 0, 0, 0, Z, 0, T, 0, T, 0]。我想编写一个算法,从数组Y中删除A并通过移动ZT来替换它们的位置(替换Z的位置}和T 0)。所以,我会得到

  • 原始数组为A = [X, 0, X, Y, Y, 0, 0, Y, Z, 0, 0, 0, Z, 0, T, 0, T, 0]
  • 结果为A = [X, 0, X, Z, Z, 0, 0, T, T, 0, 0, 0, 0, 0, 0, 0, 0, 0]

我尝试了以下内容:

  1. 找到索引I={i: A[i] = Y}
  2. 找到索引J={j: A[j] != 0 & j > max(I)}
  3. if size(I)>=size(J)然后让i循环遍历Ij循环遍历J
  4. 设置A[i]=A[j]并增加ij
  5. 我的问题是案例size(I)<size(J)

    这是另一个例子:

    • 原始数组为A = [X, Y, Y, Y, Z, 0, T]
    • 结果为A = [X, Z, T, 0, 0, 0, 0]

    另一个例子:

    • 原始数组为A = [X, Y, 0, Y, Z, T]
    • 结果为A = [X, Z, 0, T, 0, 0]

1 个答案:

答案 0 :(得分:1)

您应该能够在数组的单个正向传递中执行此操作。

想法是从数组的开头开始并寻找第一个Y.从那里,去寻找第一个Z.然后从那里寻找第一个T.

现在你有一个Y索引,Z索引和T索引。进行移位,将Z移动到Y位置,将T移动到Z位置,并将0置于旧T位置。

然后开始从当前位置移动Y索引以找到下一个Y.当您找到它时,将Z索引移动到下一个Z,并将T索引移动到下一个T. Lather,冲洗,重复。

如果你在上一个例子中没有更多的Z,那么你使用T索引来找到下一个T并用它替换Y.

当你用完Y时,你就完成了。因此,如果你有7个Y,只有3个Z和T,这并不重要。当你不能再做任何替换时,你就会停止。

实现有点繁琐,但上面显示的一般想法非常简单。