SWUST OJ#1103(数据结构之删除顺序表中指定区间的数据)

目录

题目

思路

 代码


题目

题目描述 

建立顺序表L,将指定区间的数据从顺序表中删除。假设指定区间是合法数据,无序做合法性判断。测试数据为整型。  

输入


第一行是表长n;第二行是表中数据元素;第三行是闭区间。

输出


删除以后的顺序表中的数据元素。

样例输入

10

22 32 11 23 43 59 17 65 45 57

10 20 

样例输出

22 32 23 43 59 65 45 57

思路

思路一:每删除一个在区间的值,然后整体向前移动一位,这是一个时间复杂度为O(n^2),空间复杂度为O(1)的算法

主要代码演示:

void SeqlistEarse(Seqlist* &L)
{
	int max, min, i;
	cin >> min >> max;
	for (i = 0; i < L->len; i++)
	{
		if (L->data[i] >= min && L->data[i] <= max)
		{
			for (int j = i; j < L->len - 1; j++)	L->data[j] = L->data[j + 1];
			L->len--;
		}
	}
}

 思路二:借助一个新的顺序表,存放不在区间[min,max]的值,最后再把新的顺序表输出,这是一个这是一个时间复杂度为O(n),空间复杂度为O(n)的算法

主要代码演示:

void SeqlistEarse(Seqlist* &L, Seqlist* &L1)
{
	int max, min, i;
	cin >> min >> max;
	for (i = 0; i < L->len; i++)
	{
		if (L->data[i] < min || L->data[i] > max)
		{
			L1->data[L1->len++] = L->data[i];
		}
	}
}

思路三:重新利用原来的空间完成任务,具体请看代码演示,这是一个时间复杂度为O(n),空间复杂度为O(1)的算法

主要代码演示:

void SeqlistEarse(Seqlist *&L)
{
	int max, min, i, k = 0;
	cin >> min >> max;
	for (i = 0; i < L->len; i++)
	{
		if (L->data[i] < min || L->data[i] > max)
		{
			L->data[k++] = L->data[i];
		}
	}
	L->len = k;
}

注:这三种算法按理来说都是可行的,但是博主亲测了一下只有后两种算法才能通过,SWUST OJ的后台测试,不难看出最后一种算法才是最优的,因此博主展示最后一种算法的数据结构代码C++中STL的代码

亲测:SWUST OJ#1103(数据结构之删除顺序表中指定区间的数据)_第1张图片

代码

数据结构

#include 
#include 
using namespace std;
//定义顺序表
typedef struct
{
	int data[10005], len;
} Seqlist;
//初始化顺序表
void SeqlistInit(Seqlist* &L)
{
	L = (Seqlist *)malloc(sizeof(Seqlist));
	L->len = 0;
}
//创建顺序表
void SeqlistCreate(Seqlist* &L)
{
	int n, x;
	cin >> n;
	while (cin >> x, L->data[L->len++] = x, --n);
}
//删除数据
void SeqlistEarse(Seqlist* &L)
{
	int max, min, i, k = 0;
	cin >> min >> max;
	for (i = 0; i < L->len; i++)
	{
		if (L->data[i] < min || L->data[i] > max)
		{
			L->data[k++] = L->data[i];
		}
	}
	L->len = k;
}
//打印顺序表
void SeqlistPrint(Seqlist* &L)
{
	for (int i = 0; i < L->len - 1; i++)
		cout << L->data[i] << ' ';
	cout << L->data[L->len - 1] << endl;
}
int main()
{
	Seqlist *L;
	SeqlistInit(L);
	SeqlistCreate(L);
	SeqlistEarse(L);
	SeqlistPrint(L);
	return 0;
}

STL

#include 
#include 
#include 
using namespace std;
int main()
{
	vector vec;
	int n, x, max, min, k = 0;
	cin >> n;
	while (cin >> x, vec.push_back(x), --n);
	cin >> min >> max;
	for (int i = 0; i < vec.size(); i++)
	{
		if (vec[i] < min || vec[i] > max)
			vec[k++] = vec[i];
	}
	for (int i = 0; i < k; i++)
		cout << vec[i] << ' ';
	return 0;
}

你可能感兴趣的:(数据结构系列(SWUST,OJ题解)(努力更新中),数据结构)