设计一个高效的算法,从顺序表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];
}
}