1-4 数组元素的区间删除 (20 分) 代码:

给定一个顺序存储的线性表,请设计一个函数删除所有值大于min而且小于max的元素。删除后表中剩余元素保持顺序存储,并且相对位置不能改变。

函数接口定义:

int Delete( int A[], int L, int minA, int maxA );

其中A是整型数组,存储原始线性表的元素;L是表长,即A中元素的个数;minA和maxA分别为待删除元素的值域的下、上界。函数Delete应将A中所有值大于minA而且小于maxA的元素删除,同时保证表中剩余元素保持顺序存储,并且相对位置不变,最后返回删除后的表长。

裁判测试程序样例:

#include <stdio.h>

#define MAXN 20

int Delete( int A[], int L, int minA, int maxA );

int main()
{
    int A[MAXN], L, minA, maxA, i;

   scanf("%d", &L);
    for (i=0; i<L; i++) scanf("%d", &A[i]);
    scanf("%d %d", &minA, &maxA);
    L = Delete(A, L, minA, maxA);
    for (i=0; i<L; i++) printf("%d ", A[i]);
    printf("
");

   return 0;
}

/* 你的代码将被嵌在这里 */

输入样例:

10
4 -8 2 12 1 5 9 3 3 10
0 4

输出样例:

4 -8 12 5 9 10

失败代码:

int Delete( int A[], int L, int minA, int maxA )
{
    int i,j;
    for(i=0;i<L;i++)
    {
        if(A[i]>minA&&A[i]<maxA)
        {
            if(i==(L-1))
            {
                A[i]=0;
                L--;
            }
            for(j=i;j<L-1;j++)
            {
                A[j]=A[j+1];

            }
            i--;
            L--;
        }
    }
    return  L;
}

自己敲了好多次,还是无法解决第四个测试点运行超时的问题,准备咨询一下老师以此来解决问题。
关于正确的代码,是后来看到有大佬使用memcpy函数求了出来,虚心学习,敲成功了。

正确代码:

int Delete( int A[], int L, int minA, int maxA )
{
    int i,j=0;
    int b[MAXN];
    for(i=0;i<L;i++)
    {
      if(A[i]<=minA || A[i]>=maxA)
      {
         b[j]=A[i];
         j++;
        
      }
    }
    memcpy(A,b,sizeof(int)*j);
    L=j;
    return L;
}

memcpy函数概述编辑

函数原型

void *memcpy(void *destin, void *source, unsigned n);

参数

destin-- 指向用于存储复制内容的目标数组,类型强制转换为 void* 指针。
source-- 指向要复制的数据源,类型强制转换为 void* 指针。
n-- 要被复制的字节数。

返回值

该函数返回一个指向目标存储区destin的指针。

功能

从源source所指的内存地址的起始位置开始拷贝n个字节到目标destin所指的内存地址的起始位置中。 [2]

所需头文件

C语言:#include<string.h>
C++:#include