将数组中的零移动到末尾

move zeros in an array to the end

本文关键字:移动 数组      更新时间:2023-10-16

>"这个问题属于"数组转换"的广泛类别。这个类别是技术面试的肉。主要是因为数组是一种简单易用的数据结构。遍历或表示不需要任何样板代码,大多数代码看起来像伪代码本身。

问题的 2 个要求是:

将所有 0 移到数组的末尾。

所有非零元素必须保留其原始顺序。

我的想法: 找到零并将其位置与最后一个数字交换

/* int swap;
int n=nums.size()-1;
for(int i=0;i<nums.size();i--){
if(nums[i]==0){
swap = nums[i];
nums[i] = nums[n];
nums[n] = swap;
n--;
}
}

我的输入 [0,1,0,3,12] 输出 [1,3,12,0,0] 差异 预期 [1,3,12,0,0]

而且我不知道为什么正确答案(部分(是:

(int n = 0, cur = 0; cur < nums.size(); cur++) {
if (nums[cur] != 0) {
swap(nums[n++], nums[cur]);
}
}
}

您可以使用标准库吗?std::stable_partition()使它变得微不足道。类似的东西

std::stable_partition(nums.begin(), nums.end(),
[](const auto &n){ return n != 0; });

对于帖子中的解决方案如何工作的问题:

在第一次迭代开始时,n 为 0,cur 为 0,nums 为 [0,1,0,3,12]。nums[cur]为 0,因此不会发生任何操作。在第二次迭代开始时,cur 为 1,nums[cur]为 1,因此会发生 n 的交换和增量。

现在 n 是 1,cur 是 2,nums 是 [1,0,0,3,12]。nums[cur]为 0,因此在第三次迭代中不会发生任何操作。在第四次迭代中,cur 现在为 3,会发生交换。因此,在第五次迭代开始时,n 为 2,cur 为 4,nums 为 [1,3,0,0,12]。我会把它留给你来解决这一步会发生什么。

基本上,当 n 不等于 cur 时,它是 0 元素的索引,可以与 cur 作为其索引的非 0 元素交换。这种交换最终将所有 0 移到最后。

我对这个问题的看法,最少的 std 库使用。 可能不是最有效的,但它确实可以解决问题。

#include "stdafx.h"
#include <iostream>
int main()
{
int src[]  = { 0, 1, 0, 3, 0, 12 };           // Output: 1 3 12  0 0 0   check
// = { 0, 3, 0, 1, 0, 0, 12, 0, 5 };  // Output: 3 1 12 5 0 0 0 0 0   check 
int n = sizeof(src) / sizeof(src[0]);
for (int x = 0; x < n; x++) {
for (int y = x + 1; y < n; y++) {
if (src[x] == 0 && src[y] != 0) {
int swap = src[x];
src[x] = src[y];
src[y] = swap;
}
}
}
for (int i = 0; i < n; i++) {
std::cout << src[i] << " ";
}
return 0;
}