Python 程序将所有零移动到数组末尾

2024 年 8 月 29 日 | 阅读 3 分钟

在本教程中,我们将编写 Python 程序将数组中的所有零移到末尾。问题陈述是给定一个包含一些随机数的数组,其中包含随机位置的零,但我们需要保持给定数组的顺序。例如 -

如果给定的数组是 [2, 7, 6, 0, 9, 0, 1, 0, 0, 8, 0],则应将其转换为 [2, 7, 6. 9, 1, 8, 0, 0, 0, 0, 0]。该数组保持了数组中各项的相对顺序。预期时间复杂度为 O(n),额外空间复杂度为 O(1)。

示例 -

有几种方法可以解决这个问题,我们将以令人兴奋的方式使用一些方法来解决这个问题。

解决方案实现

在此方法中,我们从左到右遍历给定数组,并将元素放置在数组中下一个可用位置。一旦所有非零元素都被放置好,我们就用零填充所有剩余的索引。

让我们通过 Python 程序来实现这种方法。

示例 -

输出

[8, 7, 4, 2, 1, 0, 0, 0]

解释 -

在上面的代码中,我们定义了 move_zero() 函数,它接受一个列表作为参数。在函数内部,我们用零初始化了一个变量,该变量用于跟踪下一个可用索引位置。然后,我们遍历列表并检查当前元素是否为非零;如果是,则将其放在下一个位置并增加 k 的计数器。一旦所有非零元素都存储在列表中,我们就从 k 到给定列表的长度运行另一个 for 循环。在剩余的索引处,我们将零放在列表的末尾。

时间复杂度 - 时间复杂度为 0(n),其中 n 是输入的大小。

上述解决方案易于实现。让我们来理解另一种解决方案。

方法 - 2:使用 Quicksort 的分区逻辑

我们也可以通过 Quicksort 分区部分的逻辑来解决这个问题。在此方法中,我们将 0 作为枢轴,并执行一次分区过程。分区逻辑读取所有元素,并将每个非枢轴元素与枢轴的第一个出现进行交换。

让我们理解下面的例子。

示例 -

输出

[6, 8, 2, 3, 4, 1, 0, 0, 0]

解释 -

在上面的代码中,我们创建了一个 swap 函数来交换元素。然后,我们创建了 partition() 方法,它调用 swap 方法,并且每次遇到非零数时,'j' 都会增加。该元素被放置在枢轴之前。

上述代码的时间复杂度为 0(n),其中 n 是输入的大小。

结论

在本教程中,我们讨论了一些解决上述问题的方法。这是一个入门级的 Python 列表相关问题,这个问题可能会在技术面试中出现。