| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2003 人关注过本帖
标题:将数组中所有的0挪到数组的末尾
只看楼主 加入收藏
风过无痕1989
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:8
帖 子:228
专家分:1050
注 册:2020-7-17
结帖率:88.89%
收藏
已结贴  问题点数:20 回复次数:9 
将数组中所有的0挪到数组的末尾
朋友购买《C Primer Plus》第六版进入邮电出版社的异步社区微信群,群里给出的题目。此题的C程序我会写,但从给出答案来看,感觉要用C++来写,故来论坛求助,请按给出的答案格式用C++编写程序,谢谢!
【每日一练 第17天】
给定一个数组nums,写一个函数,将数组中所有的0挪到数组的末尾,而维持其他所有非0元素的相对位置。
举例: nums = [9,0,0,0,10,0,0,0,11,0,12,0,13,0,14,0,15,0,16,0],函数运行后结果为[9,10,11,12,13,14,15,16,0,0,0,0,0,0,0,0,0,0,0,0]

第17天答案:
思路:创建一个临时数组nonZeroElements,遍历nums,将nums中非0元素赋值到nonZeroElements中,而后按顺序将nonZeroElements赋值到nums上,未遍历的元素置0;

代码如下:
1// 时间复杂度: O(n)
2// 空间复杂度: O(n)
3class Solution {
4public:
5    void moveZeroes(vector<int>& nums) {
6
7        vector<int>
nonZeroElements;
8
9        // 将vec中所有非0元素放入nonZeroElements中
10        for(int i = 0 ; i <  nums.size() ; i ++)
11            if(nums[ i ])
12
nonZeroElements.push_back(nums[ i] );
13
14        // 将nonZeroElements中的所有元素依次放入到nums开始的位置
15        for(int i = 0 ; i < nonZeroElements.size() ; i ++)
16            nums[ i ] = nonZeroElements[ i ];
17
18        // 将nums剩余的位置放置为0
19        for(int i = nonZeroElements.size() ; i < nums.size() ; i ++)
20            nums[ i ] = 0;
21    }
22};
搜索更多相关主题的帖子: 答案 元素 数组 int size 
2020-10-24 00:44
风过无痕1989
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:8
帖 子:228
专家分:1050
注 册:2020-7-17
收藏
得分:0 
C程序如下:

程序代码:
#include<stdio.h>
#define n 20
int main()
{
    int i,j,nums[n] = {0};
    for(i = 0;i < n;i++)
    {
        scanf("%d",&nums[i]);
    }

    for (i = 0;i < n;i++)
    {
        if(nums[i] == 0)    // 检测到数组中的0,其后的非0数据均前移
        {
            for(j = i + 1;j < n -1;j++)
            {
                if(nums[j] != 0)
                {
                    nums[i] = nums[j];    // 检测到非0,移到前面去填充 i 位置的0
                    nums[j] = 0;    //数据移走之后,该位置用0来填充,防止后面的循环再次读到
                    break;
                }
            }
        }
    }

    for(i = 0;i < n;i++)
    {
        printf("%d ",nums[i]);
    }
    printf("\n");
}


[此贴子已经被作者于2020-10-24 00:49编辑过]

2020-10-24 00:46
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9031
专家分:54061
注 册:2011-1-18
收藏(1)
得分:20 
程序代码:
#include <iostream>
#include <iterator>
#include <algorithm>

void foo_c( int a[], size_t n )
{
    int* q = a;
    for( int *p=a; p!=a+n; ++p )
        if( *p != 0 )
            *q++ = *p;
    for( ; q!=a+n; ++q )
        *q = 0;
}

template<typename T,size_t N> void foo_cpp( T (&a)[N] )
{
    std::stable_partition( a, a+N, [](T n){return n>0;} );
}

template<typename T,size_t N> void print( const T (&a)[N] )
{
    std::copy( a, a+N, std::ostream_iterator<T>(std::cout," ") );
    std::cout << std::endl;
}

int main( void )
{
    {
        int nums[] = { 9,0,0,0,10,0,0,0,11,0,12,0,13,0,14,0,15,0,16,0 };
        foo_c( nums, sizeof(nums)/sizeof(*nums) );
        print( nums );
    }

    {
        int nums[] = { 9,0,0,0,10,0,0,0,11,0,12,0,13,0,14,0,15,0,16,0 };
        foo_cpp( nums );
        print( nums );
    }
}
2020-10-24 11:41
风过无痕1989
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:8
帖 子:228
专家分:1050
注 册:2020-7-17
收藏
得分:0 
回复 3楼 rjsp
谢谢!

第17行出错,我在编译选项添加 -std=c++11 或者 -std=gnu++11 也没有用:

In function 'void foo_cpp(T (&)[N])':

[Warning] lambda expressions only available with -std=c++11 or -std=gnu++11

In instantiation of 'void foo_cpp(T (&)[N]) [with T = int; unsigned int N = 20u]':

required from here

[Error] no matching function for call to 'stable_partition(int [20], int*, foo_cpp(T (&)[N]) [with T = int; unsigned int N = 20u]::<lambda(int)>)'

[Note] candidate is:

In file included from C:/Program Files/Dev-Cpp/MinGW64/lib/gcc/x86_64-w64-mingw32/4.9.2/include/c++/algorithm

lib\gcc\x86_64-w64-mingw32\4.9.2\include\c++\bits\stl_algo.h    [Note] template<class _BIter, class _Predicate> _BIter std::stable_partition(_BIter, _BIter, _Predicate)

lib\gcc\x86_64-w64-mingw32\4.9.2\include\c++\bits\stl_algo.h    [Note] template argument deduction/substitution failed:

In substitution of 'template<class _BIter, class _Predicate> _BIter std::stable_partition(_BIter, _BIter, _Predicate) [with _BIter = int*; _Predicate = foo_cpp(T (&)[N]) [with T = int; unsigned int N = 20u]::<lambda(int)>]':

required from 'void foo_cpp(T (&)[N]) [with T = int; unsigned int N = 20u]'

required from here

[Error] template argument for 'template<class _BIter, class _Predicate> _BIter std::stable_partition(_BIter, _BIter, _Predicate)' uses local type 'foo_cpp(T (&)[N])
[with T = int; unsigned int N = 20u]::<lambda(int)>'

[Error] trying to instantiate 'template<class _BIter, class _Predicate> _BIter std::stable_partition(_BIter, _BIter, _Predicate)'
2020-10-24 12:41
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9031
专家分:54061
注 册:2011-1-18
收藏
得分:0 
既然你加了 -std=c++11 为什么还报 [Warning] lambda expressions only available with -std=c++11 or -std=gnu++11
我怀疑你没加对地方,或者是IDE有bug需要重新编译一下,你贴个图我看看吧

BTW:
自从 gcc6 之后,就不再默认用古老的c++98标准了
我怀疑你用的是 devcpp,它自带的是老旧的 tdm–gcc4.9.2
目前,Linux上gcc最新是gcc10,Windows上mingw是9.2,tdm–gcc也是9.2,mingw–w64是8.1
2020-10-24 20:18
风过无痕1989
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:8
帖 子:228
专家分:1050
注 册:2020-7-17
收藏
得分:0 
回复 5楼 rjsp
没错,我用的是DEV_C++5.11 TDM GCC4.9.2
2020-10-24 23:26
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9031
专家分:54061
注 册:2011-1-18
收藏
得分:0 
回复 6楼 风过无痕1989
它是支持lambda的呀,你  -std=c++11 加对了吗?
如果确定加对了,在源码里随便加个空格,重新编译试试
2020-10-24 23:39
风过无痕1989
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:8
帖 子:228
专家分:1050
注 册:2020-7-17
收藏
得分:0 
回复 7楼 rjsp
好像是输出了两次
2020-10-25 00:44
风过无痕1989
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:8
帖 子:228
专家分:1050
注 册:2020-7-17
收藏
得分:0 
回复 7楼 rjsp
我去掉你代码最后的三行,输出正常了

[此贴子已经被作者于2020-10-26 02:15编辑过]

2020-10-25 01:37
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9031
专家分:54061
注 册:2011-1-18
收藏
得分:0 
回复 8楼 风过无痕1989
foo_c 是用的 C语言 方式
foo_cpp 用的是 C++语言
我只是将它们写在同一个程序中
2020-10-25 11:02
快速回复:将数组中所有的0挪到数组的末尾
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.019439 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved