顺序表 删除指定范围的数据

设计一个高效的算法,从顺序表L中删除所有值介于x和y之间(包括x和y)的所有元素(假设y>=x),要求时间复杂度为O(n),空间复杂度为O(1)。
题目描述
【调试过很多次的可能错误点】
①L->last指代的是最后一个数据的下标,i的判出条件必须有等号
②j++在赋值之后,所以最后一次赋值后多加了一次,last需要减一
③最开始其实是想用一个新的list,先将合适的数据给list,然后最后再还给L,但报错,原因是题目要求空间复杂度O(1),不允许建立新的list,但实际应用中应该是没问题的,将代码附在最后。

#include <stdio.h>
#include <stdlib.h>
#include "list.h" // 请不要删除,否则检查不通过

void del_x2y(SeqList *L, ElemType x, ElemType y) {
    int i,j=0;
    for(i=0;i<=L->last;i++){
        if(L->elem[i]>y||L->elem[i]<x){
             L->elem[j]=L->elem[i];
             j++;
        }
        //if(j<i)L->elem[i]=0;//这句加的时候是为了保证顺序表在last后面还有有数据的情况,不过其实不太需要,后续如果需要使用一定会有判断,不会调用last后面的数据,所以可以不要
    }
    L->last=--j;
}
//这个代码是错的!不合题意!仅供警示!
#include <stdio.h>
#include <stdlib.h>
#include "list.h" // 请不要删除,否则检查不通过

void del_x2y(SeqList *L, ElemType x, ElemType y) {
    SeqList *list=(SeqList *)malloc(sizeof(SeqList));
    int i,j=0;
    for(i=0;i<=L->last;i++){
        if(L->elem[i]>y||L->elem[i]<x){
             list->elem[j]=L->elem[i];
             j++;
        }
    }
    L->last=--j;
    for(i=0;i<=L->last;i++){
         L->elem[i]=list->elem[i];
    }
}
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值