在一个整型数组a中,删除所有的大于24的数值,并且要求算法对任意的这种数组算法都成立。

题目:

编程:请分别求解以下问题

在一个整型数组a中,删除所有的大于24的数值,并且要求算法对任意的这种数组算法都成立。

  1. 如果要求剩余数组中元素不改变原有元素的相对顺序,且空间复杂度为O(1)
  2. 如果要求算法时间复杂度为O(n),空间复杂度为O(1)

void deleteall(int a[] ,int &n)//a为待删除的数组,n为元素个数

分别构造10组测试用例,证明算法确实对任意的这种数组算法都成立。

代码及注释:

#include <iostream>

using namespace std;

const int max = 1e5;
int a[max];//数组

void deleteallone(int a[] , int &n);//算法函数1:不改变元素的相对顺序,空间复杂度为O(1)

void deletealltwo(int a[] , int &n);//算法函数2:时间复杂度为O(n),空间复杂度为O(1)

void swap(int &v1 , int &v2);//交换两个数值


int main()
{
    int n,i;

    cin>>n;//输入数组个数

    for(i = 0 ; i < n ; i++)//输入数组的每个值
    {
           cin>>a[i];
    }

    //deleteallone(a,n);//调用

    deletealltwo(a,n);//调用

    i= 0;

    if(i== n)//判断打印
    {
           cout<<"该数组的值都大于24"<<endl;
    }else
    {
           for(i = 0 ; i < n ;i++)//打印
           {
                  cout<<a[i]<<" ";
           }
    }

    return 0;
}


void deleteallone(int a[] , int &n)
{
    int i= 0,pos= n-1;
    while(i<= pos)
    {
           if(a[i]> 24)
           {
                  for(int j= i; j< pos; j++)//将后面的值向前移
                  {
                         a[j]= a[j+1];
                  }
                  pos--;
           }else{
                  i++;//移到下一个
           }
    }

    n= pos+1;
}


void deletealltwo(int a[] , int &n)
{

    int i= 0,pos= n-1;

    while(i<= pos)
    {
           if(a[i]> 24)
           {
                  swap(a[i],a[pos]);//将当前值与最后一个值交换
                  pos--;//最后一个值向前移
           }else
           {
                  i++;//移到下一个
           }

    }

    n= pos+1;

}


void swap(int &v1 , int &v2)
{

       v1= v2-v1;

       v2= v2-v1;

       v1= v2+v1;

       /*int count;

       count= v1;

       v1=v2;

       v2=count;*/

}

测试用例

输入:   8

              70 56 75 19 42 90 96 46

算法函数1输出:19

算法函数2输出:19

 

输入:   10

              12 5 46 59 73 63 93 78 12 25

算法函数1输出:12 5 12

算法函数2输出:12 5 12

 

输入:   6

              3 88 1 58 75 1

算法函数1输出:3 1 1

算法函数2输出:3 1 1

 

输入:   5

              25 25 25 25 25

算法函数1输出:该数组的值都大于24

算法函数2输出:该数组的值都大于24

 

输入:   5

              24 24 24 24 24

算法函数1输出:24 24 24 24 24

算法函数2输出:24 24 24 24 24

 

输入:   22

              35 54 16 99 11 25 16 64 70 30 12 11 81 38 22 5 76 71 35 57 5 98

算法函数1输出:16 11 16 12 11 22 5 5

算法函数2输出:5 5 16 22 11 11 16 12

 

输入:   40

              38 7 49 81 3 79 88 41 42 87 82 67 26 24 7 18 98 56 98 15 17 31 42 78 98 46 83 31 45 19 18 71 64 66 80 67 39 8 96 38

算法函数1输出:7 3 24 7 18 15 17 19 18 8

算法函数2输出:8 7 18 19 3 17 15 18 7 24

 

输入:   99

              67 27 17 48 91 66 34 66 96 46 21 79 38 80 88 64 95 90 44 20 92 11 32 22 29 97 64 73 86 67 1 83 36 63 79 83 13 0 75 65 66 89 74 65 29 34 2 70 50 15 47 48 91 62 33 58 4 20 72 5 8 63 35 55 36 49 49 51 79 29 93 53 95 10 62 56 70 37 10 75 65 24 82 49 38 67 22 28 32 74 17 15 95 35 44 98 75 89 21

算法函数1输出:17 21 20 11 22 1 13 0 2 15 4 20 5 8 10 10 24 22 17 15 21

算法函数2输出:21 15 17 17 22 24 10 10 8 5 21 20 4 15 2 0 13 1 22 20 11

 

输入:   30

              40 3 58 85 2 50 93 54 37 24 9 98 81 47 61 0 87 78 2 13 4 14 25 24 20 76 63 29 89 63

算法函数1输出:3 2 24 9 0 2 13 4 14 24 20

算法函数2输出:20 3 24 14 2 4 13 2 0 24 9

 

输入:   13

              60 70 28 1 41 58 12 97 0 65 56 7 40

算法函数1输出:1 12 0 7

算法函数2输出:7 0 12 1

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值