乐乐学编程 发表于 2020-10-21 17:44:18

C语言越学越不懂了,请教

本帖最后由 乐乐学编程 于 2020-10-21 17:47 编辑

这个题目我不看答案会做,看答案就不会了,请求帮助

【每日一练 第17天】
给定一个数组nums,写一个函数,将数组中所有的0挪到数组的末尾,而维持其他所有非0元素的相对位置。

举例: nums = ,函数运?后结果为

第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};

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

    for (i = 0;i < n;i++)
    {
      if(nums == 0 && i + 1 < n)    // 检测到数组中的0,其后的数据均前移
        {
             for(j = i;j < n;j++)
          {
                nums = nums;
          }
      }
    }

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

资治通鉴 发表于 2020-10-21 18:49:15

我用C++简单实现了以下,写的比较渣,欢迎交流

#include <iostream>
#include <vector>
using namespace std;

double* move(double arr[], int len)
{
    vector<double> vct;
    for(int i=0; i<len; i++)
    {
      if(arr != 0)
            vct.push_back(arr);
    }

    double *temp = new double;
    for(int i=0; i<len; i++)
      temp = vct;
    return temp;
}

int main(void)
{
    double arr[] = {2, 0, 4, 5, 6, 0, -2, -3, -4};
    double *temp = move(arr, 9);

    for(int i=0; i<sizeof(arr)/sizeof(arr); i++)
      cout << temp << ", ";
    cout << endl;

    return 0;
}

其中arr是测试数据,temp作为返回元素

资治通鉴 发表于 2020-10-21 18:50:27

说真的,能用C++我就不想用C了
用C++真的太爽了,虽然还有很多没学(C++比Java难多了),但是能感觉到这种简洁性

xieglt 发表于 2020-10-21 19:33:33

本帖最后由 xieglt 于 2020-10-21 20:05 编辑

#include <stdio.H>
#define N 20

int main()
{
        int i,j,k;
        int num = {0};
        int * p = num;

        for(i = 0 ; i < N ; i ++)
        {
                scanf("%d",&num);
        }

        for(i = 0 , j = N-1; i < j ; )
        {
                if(*p == 0)
                {
                        //如果要实现所谓的 O(N) 可以把这个循环换成函数内存复制 memcpy
                        //memcpy(p,p+1,sizeof(int)*(j - (p - num)));
                        for(k = 0 ; k < j-1 ; k ++)
                        {
                                *(p + k) = *(p + k + 1);
                        }

                        num = 0;
                }
                //你的代码的问题出在这里, num ==0 时,i 不应该自加,
                //因为如果 num 也等于 0 ,把后面的复制到前面后,num 又等于0了,而你把 i 自加了,就把这个0空过了
                else
                {
                        p++;
                        i++;
                }
        }

        for(i = 0 ; i < N ; i ++)
        {
                printf("%d,",num);
        }

        return 0;
}

乐乐学编程 发表于 2020-10-21 22:57:06

资治通鉴 发表于 2020-10-21 18:50
说真的,能用C++我就不想用C了
用C++真的太爽了,虽然还有很多没学(C++比Java难多了),但是能感觉到这种 ...

朋友,我看不懂C++{:5_104:}

乐乐学编程 发表于 2020-10-21 23:02:25

xieglt 发表于 2020-10-21 19:33


我的代码是正确的,在DEV_C++ 与 VC++6.0 中运行都是正常的

我求助的是,他给的那个答案,什么时间复杂度,空间复杂度呀,那些乱七八糟的,请帮改写成他的答案那种形式,谢谢!

xieglt 发表于 2020-10-22 07:42:20

本帖最后由 xieglt 于 2020-10-22 07:48 编辑

程序不是编译通过就是对的,要多种输入测试看运行结果。左边是你的代码的运行结果。并不符合题意。
至于时间复杂度O(N),主要是指程序要经过多少次循环,比如说logn 次,n次,n*logn次,n平方次等等。
空间复杂度是指程序里有没有额外分配内存,分配了多少。原答案用到了额外的数组,空间复杂度应该是O(2n)

乐乐学编程 发表于 2020-10-22 19:07:03

xieglt 发表于 2020-10-22 07:42
程序不是编译通过就是对的,要多种输入测试看运行结果。左边是你的代码的运行结果。并不符合题意。
至于时 ...

谢谢你指出的错误,我调试时没有那么多的0,而且还是连续的0,为此,我修改了程序,将第13句到20句修改为:


      if(nums == 0)    // 检测到数组中的0,其后的非0数据均前移
      {
            for(j = i + 1;j < n -1;j++)
            {
                if(nums != 0)
                                {
                                        nums = nums;
                                        nums = 0;
                                        break;
                                }
            }
      }



这个代码,简单明了,没有你的那个复杂。还是请帮按给出的答案,写一个,谢谢!

xieglt 发表于 2020-10-22 19:29:38

这么执着,好吧。满足你。

#include <stdio.H>
#define N 20

int main()
{
        int i,j;
        int num = {0};
        int buffer = {0};

        for(i = 0 ; i < N ; i ++)
        {
                scanf("%d",&num);
        }


        for(i=0,j=0 ; i < N ; i ++)
        {
                if(num != 0)
                {
                        buffer = num;
                }
        }

        for(i=0 ; i<N ;i++)
        {
                num = buffer;
                printf("%d,",num);
        }

        return 0;
}

xieglt 发表于 2020-10-22 19:32:12

乐乐学编程 发表于 2020-10-22 19:07
谢谢你指出的错误,我调试时没有那么多的0,而且还是连续的0,为此,我修改了程序,将第13句到20句修改为 ...

你的代码你还是好好测一下吧,我的直觉是不一定行。关键是


if(num == 0)    //==0时 i 不要自增,道理我前面已经说过了。
{

}
else
{
   i++;
}

乐乐学编程 发表于 2020-10-22 19:43:28

xieglt 发表于 2020-10-22 19:32
你的代码你还是好好测一下吧,我的直觉是不一定行。关键是

我试过了

输入:10,0,0,0,9,0,0,0,11,0,12,0,13,0,14,0,15,0,16,0
输出:10,9,11,12,13,14,15,16,0,0,0,0,0,0,0,0,0,0,0,0

检测到0以后,我让 j 指向其下一个数 j = i + 1,如果 j 遇到的是0,则循环到下一个,直至不是0为止,将这个不为0的数存入 i 这个单元中,同时将 j 的这个单元置0,以防止下次循环再调用到它,终止此次循环。i 加1以后,再重复上面的动作。。。。。。

xieglt 发表于 2020-10-22 20:25:10

乐乐学编程 发表于 2020-10-22 19:43
我试过了

输入:10,0,0,0,9,0,0,0,11,0,12,0,13,0,14,0,15,0,16,0


你要的那个跟答案一样的方法在上一楼.

乐乐学编程 发表于 2020-10-22 21:00:38

xieglt 发表于 2020-10-22 20:25
你要的那个跟答案一样的方法在上一楼.

我晕,将非0数暂存于一个临时数组,当然是最简单的办法啦~~他不给出下面的代码,我当然是哪个简单就用哪个方法来做题,难道我真的被出题的混蛋给骗了?又是 class,又是 public ,还 nonZeroElements.push_back 函数都出来了

我想弄清楚的是为什么他会给出下面的代码?

代码如下:
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};

xieglt 发表于 2020-10-22 21:39:43

乐乐学编程 发表于 2020-10-22 21:00
我晕,将非0数暂存于一个临时数组,当然是最简单的办法啦~~他不给出下面的代码,我当然是哪个简单就用哪 ...

这是C++代码,
vector<int> xxx;就是定义一个数组

资治通鉴 发表于 2020-10-22 22:45:59

#inclue <iostream>
using namespace std;

void move(int arr[], int len)
{
      for(int i=0, j=-1; i<len; i++)
      {
                for(; arr!=0; j++)
                {
                        if(i != j)
                        {
                              arr = arr;
                              arr = 0;
                         }
               }
      }
}

乐乐学编程 发表于 2020-10-22 23:20:30

资治通鉴 发表于 2020-10-22 22:45
#inclue
using namespace std;



现在不是这个问题,朋友,是他给的答案如何实现

乐乐学编程 发表于 2020-10-22 23:21:30

xieglt 发表于 2020-10-22 21:39
这是C++代码,
vector xxx;就是定义一个数组

是的呀,这么一个简单的问题,他为什么给出那么复杂的答案?

资治通鉴 发表于 2020-10-23 00:28:47

乐乐学编程 发表于 2020-10-22 23:21
是的呀,这么一个简单的问题,他为什么给出那么复杂的答案?

朋友,我给出了两个解法,你随便调一个就行啦

xieglt 发表于 2020-10-23 09:39:53

乐乐学编程 发表于 2020-10-22 23:21
是的呀,这么一个简单的问题,他为什么给出那么复杂的答案?

你认为复杂,是因为你不懂C++。人家用C++写,不违背题意吧,真纠结!

乐乐学编程 发表于 2020-10-23 16:46:05

资治通鉴 发表于 2020-10-21 18:49
我用C++简单实现了以下,写的比较渣,欢迎交流

#include


你将2楼这个程序修改一下,数组元素改为20个吧

另外,2楼这个程序,非0时输出是乱码,请改回输出0

我不懂C++,就算收藏吧,等以后学习了C++,再来研究每一条语句的功用
页: [1] 2
查看完整版本: C语言越学越不懂了,请教