2017-11-10 67 views
-2

我有这样一个数组:A = [X, 0, X, Y, Y, 0, 0, Y, Z, 0, 0, 0, Z, 0, T, 0, T, 0]。我想写一个算法,从阵列A中删除Y,并通过移动ZT(将ZT的位置替换为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) then let i loop through I and j loop through J
  4. 设置A[i]=A[j]并增加ij

我的问题是与案件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]
+0

因为我将两个'Z'都移到了左边。 – Ribz

+0

StackOverflow希望您[尝试首先解决您自己的问题](http://meta.stackoverflow.com/questions/261592),并且我们也[不回答作业问题](https://softwareengineering.meta。 stackexchange.com/questions/6166)。请更新您的问题,以显示您已经在[最小,完整和可验证的示例]中尝试过的内容(http://stackoverflow.com/help/mcve)。有关更多信息,请参阅[如何提出良好问题](http://stackoverflow.com/help/how-to-ask),并参加[网站之旅](http://stackoverflow.com/tour ):) – Barmar

+0

我写了我所尝试过的,这不是一个家庭作业问题。也许,python部分就是你所看到的。然后我从这个问题中删除Python。 – Ribz

回答

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's,那么你就完成了。所以,如果你有7个Y,只有3个Z和T,这并不重要。当你不能再做更换时,你停下来。

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

相关问题