删除顺序表表中值为X的数据元素,要求时间复杂度为O(n),空间复杂度为O(1)

要求时间复杂度为O(n)那么要求你所实现的算法只包含一层for循环,也就是说一需要在一轮扫描中完成删除所有的值为X的数据元素的操作,空间复杂度为O(1)要求你不能借助另一个数组来实现此算法

算法思路:用一个变量来记录当前已经扫描到的值为X的数据元素的个数,然后将当前的数据元素向前移动k个位置

代码实现步骤

1、定义顺序表

//定义顺序表
typedef struct {
	int data[MAX];
	int length;
}sqList;

 2、实现InitList操作

//对顺序表进行初始化
void InitList(sqList& L) {
	L.length = 0;
}

3、实现 listInsert操作

//向顺序表中的指定位置插入指定值
bool listInsert(sqList& L, int i, int e)
{
	if (i<1 || i>L.length + 1)
		return false;
	for (int j = L.length; j >= i; j--)
	{
		L.data[j] = L.data[j - 1];
	}
	L.data[i - 1] = e;
	L.length++;
}

4、算法实现

//删除顺序表中值为X的数据元素,要求算法性能要好,时间复杂度为O(n),空间复杂度为O(1)
void deleteX(sqList& L, int x)
{
	int x_num = 0;  //记录当前已经扫描到的顺序表中值等于x的数据元素个数
	for (int i = 0; i < L.length; i++)
	{
		if (L.data[i] == x)
		{
			x_num++;
		}
		else
		{
			L.data[i - x_num] = L.data[i];
		}
	}
	L.length = L.length - x_num;
}

5、代码测试


int main()
{
	sqList L;
	InitList(L);
	listInsert(L, 1, 0);
	listInsert(L, 2, 1);
	listInsert(L, 3, 3);
	listInsert(L, 4, 1);
	listInsert(L, 5, 5);
	listInsert(L, 6, 1);
	listInsert(L, 7, 7);
	listInsert(L, 8, 1);
	listInsert(L, 9, 8);
	printf("未删除前:\n");
	for (int i = 0; i < L.length; i++)
	{
		printf("%d\t", L.data[i]);
	}
	deleteX(L, 1);
	printf("\n删除后:\n");
	for (int i = 0; i < L.length; i++)
	{
		printf("%d\t", L.data[i]);
	}


}

6、测试结果

删除顺序表表中值为X的数据元素,要求时间复杂度为O(n),空间复杂度为O(1)_第1张图片

完整源代码

//删除顺序表表中值为X的数据元素,要求时间复杂度为O(n),空间复杂度为O(1)
#include
#include
using namespace std;
#define MAX 100

//定义顺序表
typedef struct {
	int data[MAX];
	int length;
}sqList;

//对顺序表进行初始化
void InitList(sqList& L) {
	L.length = 0;
}

//向顺序表中的指定位置插入指定值
bool listInsert(sqList& L, int i, int e)
{
	if (i<1 || i>L.length + 1)
		return false;
	for (int j = L.length; j >= i; j--)
	{
		L.data[j] = L.data[j - 1];
	}
	L.data[i - 1] = e;
	L.length++;
}

//删除顺序表中值为X的数据元素,要求算法性能要好,时间复杂度为O(n),空间复杂度为O(1)
void deleteX(sqList& L, int x)
{
	int x_num = 0;  //记录当前已经扫描到的顺序表中值等于x的数据元素个数
	for (int i = 0; i < L.length; i++)
	{
		if (L.data[i] == x)
		{
			x_num++;
		}
		else
		{
			L.data[i - x_num] = L.data[i];
		}
	}
	L.length = L.length - x_num;
}

int main()
{
	sqList L;
	InitList(L);
	listInsert(L, 1, 0);
	listInsert(L, 2, 1);
	listInsert(L, 3, 3);
	listInsert(L, 4, 1);
	listInsert(L, 5, 5);
	listInsert(L, 6, 1);
	listInsert(L, 7, 7);
	listInsert(L, 8, 1);
	listInsert(L, 9, 8);
	printf("未删除前:\n");
	for (int i = 0; i < L.length; i++)
	{
		printf("%d\t", L.data[i]);
	}
	deleteX(L, 1);
	printf("\n删除后:\n");
	for (int i = 0; i < L.length; i++)
	{
		printf("%d\t", L.data[i]);
	}


}

你可能感兴趣的:(数据结构,数据结构,算法,程序人生,笔记,学习)