将数组中的零移动到末尾

时间:2019-10-22 01:49:26

标签: c++

“问题属于“数组转换”的广义范畴。这一类别是技术访谈的重点。主要是因为数组是如此简单易用的数据结构。遍历或表示不需要任何样板代码而且您的大多数代码看起来都像伪代码本身。

问题的两个要求是:

将所有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]);
         }
       }
    }

2 个答案:

答案 0 :(得分:4)

您可以使用标准库吗? 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,num为[1,0,0,3,12]。 nums[cur]为0,因此在第三次迭代中没有任何反应。在当前为3的第四次迭代中,发生交换。因此,在第五次迭代开始时,n为2,cur为4,nums为[1,3,0,0,12]。我会把它留给您,弄清楚那一步会发生什么。

基本上,当n不等于cur时,可以将0元素的索引替换为cur为其索引的非0元素。这种交换最终会将全0移到末尾。

答案 1 :(得分:0)

我对这个问题的看法是,最小的标准库使用率。可能不是最有效的,但可以解决问题。

grep -E