删除顺序表表中值为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)
#include<stdio.h>
#include<stdlib.h>
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]);
	}


}

  • 8
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
顺序表删除所有值为x的元素要求空间复杂度为O(1),可以使用双指针技术来实现。具体的方法是使用两个指针,一个指向顺序表的起始位置,另一个在前面指针之后初始化,并向后移动。当后面的指针指向的元素不是x时,就将这个元素复制到前面指针的位置,并将前面指针向前移动。这样,所有不等于x的元素都会被复制到顺序表的前面部分,最后再根据复制后的元素数量来调整顺序表的大小。 以下是一个使用C++实现的示例代码: ```cpp #include <iostream> void removeX(int* arr, int& size, int x) { int k = 0; // k用来记录不等于x的元素的个数 for (int i = 0; i < size; ++i) { if (arr[i] != x) { arr[k++] = arr[i]; // 将不等于x的元素移动到数组的前面 } } size = k; // 更新顺序表的大小 } int main() { int arr[] = {1, 2, 3, 4, 3, 2, 1}; int size = sizeof(arr) / sizeof(arr[0]); int x = 3; // 需要删除元素值 removeX(arr, size, x); // 打印删除特定值后的顺序表 for (int i = 0; i < size; ++i) { std::cout << arr[i] << " "; } std::cout << std::endl; return 0; } ``` 在这个代码,`removeX`函数接收一个整型数组`arr`、一个引用`size`表示数组的大小和一个整数`x`表示需要删除元素值。函数内部使用双指针技术,其`k`指针用来记录不等于x的元素的个数,通过遍历数组并更新`k`的值来实现删除操作。最后,将数组的大小更新为`k`。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值